R 使用data.tables失败

R 使用data.tables失败,r,data.table,shiny,R,Data.table,Shiny,作为后续行动,我进一步调查了该问题,并意识到该问题可能源于我对data.tables的使用数据。表s通过引用进行修改,不像数据.frames那样,这使得它们的使用效率更高,但对于闪亮的来说显然是不可见的 在下面的示例中,按下提交按钮会触发data.frame案例中的观察区块,但不会触发data.table案例中的观察区块。一种解决方法是将一个值链接到数据表的更改,这也有助于触发反应性 使用data.frame 使用data.table 用户界面 代码作用的简短摘要-按下按钮应向控制台打印一些文本

作为后续行动,我进一步调查了该问题,并意识到该问题可能源于我对
data.table
s的使用<代码>数据。表s通过引用进行修改,不像
数据.frame
s那样,这使得它们的使用效率更高,但对于
闪亮的
来说显然是不可见的

在下面的示例中,按下提交按钮会触发
data.frame
案例中的观察区块,但不会触发
data.table
案例中的观察区块。一种解决方法是将一个值链接到
数据表的更改,这也有助于触发反应性

使用data.frame 使用data.table 用户界面
代码作用的简短摘要-按下按钮应向控制台打印一些文本,其中包括字符串“one”。该按钮应进一步触发observe区块,提示打印一些包含字符串“two”的文本。根据观察块中的if条件,可能会打印另一组包含“三”的文本。在data.frame的server.r案例中,这种行为在应用程序运行的所有时间都会持续。在data.table的server.r案例中,单击几下按钮就会出现这种行为,之后只打印“一”字符串,而不打印“二”和“三”。想想看,在第一次发现if条件为false之后,就会出现这种翻转行为。

如果您关心内存,那么这是一个黑客解决方案:

添加DTControl值:

lReactiveValues = reactiveValues(a = data.table(firstcol = runif(1)), DTControl = 0)
然后在参考更改后将其与以下内容配对:

lReactiveValues$a[, newcol := new]
lReactiveValues$DTControl <- lReactiveValues$DTControl + 1
由于DTControl更新,因此会触发被动功能。需要一点努力才能确保始终将这两者配对在一起,但它可以在没有任何内存负载的情况下覆盖此引用问题


无论如何,这应该在shiny中突出显示为一个问题。

可以使用[[或$]修改data.table并将其保存到反应式表达式中。例如:

dt <- reactiveVal(data.table(a=c(1,2),b=c(10,20))

dt您可以尝试
copy
强制修改内存中对象的地址。如果这样,这是一个很好的提示。但是数据表通常是大型数据集,如果可以,我希望避免复制。我使用了很多数据。表有光泽,但从来没有作为反应值。我通过引用和使用反应函数进行更新,从来没有遇到过任何问题原因是。我无法找出您的示例代码来向您推荐一些变通方法。@jangorecki-很好。我已经为问题添加了一个描述。谢谢,但我已经在问题中提到了这种变通方法。
lReactiveValues = reactiveValues(a = data.table(firstcol = runif(1)), DTControl = 0)
lReactiveValues$a[, newcol := new]
lReactiveValues$DTControl <- lReactiveValues$DTControl + 1
lReactiveValues$DTControl
dt <- reactiveVal(data.table(a=c(1,2),b=c(10,20))
observeEvent(dt(), { print(dt()) })
observeEvent(input$mybutton, { 
  x <- dt()
  x[a==1][["b"]] <- 100
  dt(x)
})
server <- shinyServer ( 
  
  function(input, output, session) {
    
    lReactiveValues = reactiveValues(a = data.table(firstcol = runif(1)))
    # lReactiveValues = reactiveValues(a = data.frame(firstcol = runif(1)))
    
    voidaA = observeEvent(
      input$buttonCommit,
      {
        new = runif(1)
        cat(new,' one\t')
        
        lRV <- lReactiveValues$a
        lRV[["newcol"]] <- new
        lReactiveValues$a <- lRV
        
        cat(ncol(lReactiveValues$a))
      }
    )
    
    voidB = observe(priority = 50,{
      # input$buttonCommit
      cat(ncol(lReactiveValues$a))
      
      counter = runif(1)
      cat(counter,' two\t'); 
      
      if (counter > 0.5) {
        
        cat('\n')
        
        cat(ncol(lReactiveValues$a),' three\n')
        
      }
    }
    )
    
  }
)

ui <- dashboardPage(
  
  dashboardHeader(
    
    title = "Analytics"
    
  ),
  
  ## Sidebar content
  dashboardSidebar(
    menuItem("Analysis", tabName = "tabAnalysis", icon = icon("calculator"))
  ),
  
  ## Body content
  dashboardBody(
    tabItems(
      tabItem(
        tabName = "tabAnalysis",
        actionButton("buttonCommit", "Commit!")
      )
    )
    #, style='width: 100%; height: 100%;'
    
  )
)

shinyApp(ui,server)