r - data.tables 的 Shiny react 失败

标签 r data.table shiny

作为 Modifying a reactive value should trigger an observe chunk 的后续行动,我进一步调查了该问题,并意识到该问题可能源于我对 data.table 的使用。与 data.frame 不同,data.table 是通过引用进行修改的,这使得它们使用起来更加高效,但对于 shiny 的 react 性来说显然也是不可见的.

在下面的示例中,按下提交按钮会在 data.frame 情况下触发观察 block ,但在 data.table 情况下则不会。解决方法可能是让一个值与 data.table 的更改相关联,这也有助于触发 react 性。

使用 data.frame

shinyServer ( 

   function(input, output, session) {

      lReactiveValues = reactiveValues(a = data.frame(firstcol = runif(1)))

      voidaA = observeEvent(
         input$buttonCommit,
         {
            new = runif(1)
            cat(new,' one\t')
            lReactiveValues$a[letters[ncol(isolate(lReactiveValues$a))]] = new
         }
      )

      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')

         }
      }
      )

   }
)

与 data.table

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')
            setnames(
               lReactiveValues$a[, newcol := new],
               'newcol',
               letters[ncol(isolate(lReactiveValues$a))]
            )
            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.r

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%;'

   )
)

代码功能的简短摘要 - 按下按钮应将一些文本打印到控制台,其中包括字符串“one”。该按钮应该进一步触发观察 block ,提示打印一些包含字符串“two”的文本。根据观察 block 中的 if 条件,可能会打印另一组包含“三”的文本。在 data.frame 的 server.r 情况下,此行为在应用程序运行期间始终存在。在 data.table 的 server.r 情况下,单击几次按钮就会出现此行为,之后仅打印“一”字符串,而不会打印“二”和“三”字符串。想一想,这种行为翻转是在第一次发现 if 条件为假之后发生的。

最佳答案

如果您担心内存问题,一个 hacky 解决方案:

添加 DTControl 值:

lReactiveValues = reactiveValues(a = data.table(firstcol = runif(1)), DTControl = 0)

然后在引用更改后将其与以下内容配对:

lReactiveValues$a[, newcol := new]
lReactiveValues$DTControl <- lReactiveValues$DTControl + 1

然后在观察函数中添加这一行:

lReactiveValues$DTControl

由于您的 DTControl 更新, react 函数被触发。需要花费一些精力来确保您始终将两者配对在一起,但它可以在没有任何内存负载的情况下覆盖此引用问题。

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

关于r - data.tables 的 Shiny react 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32536940/

相关文章:

r - 如何从 cv.glmnet 中使用成本函数提取实际分类错误率,以便与 cv.glm 进行比较?

r - 使用数据表或 igraph 按组查找直接邻居

r - 为什么:=比`:=`()快?

R Shiny 打印当前页面

r - 为每行插入一个数字输入 - R Shiny

r - R中同一张图上的频率和累积频率曲线

arrays - 在R中的三维数组中将n维加在一起

javascript - 用 R + V8 抓取内华达州议会/参议院网站

r - 将列名与 R 中的列数据连接起来(使用 data.table)

javascript - R Shiny 的动态弹出窗口(可以移动)