作为 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/