对于Shiny应用程序,在server.R中,我当前通过反应命令从输入的文件加载数据。当我在server.R中的多个显示中调用data1()时(见下文),有没有办法只调用一次data1?如果我在render方法之外使用data1(),我会收到以下错误:“没有活动的响应上下文时不允许操作”。
data1 <- reactive({
file1 = input$file1
if (is.null(file1))
return(NULL)
data <- getNormalizedData(file1$datapath, input$value)
data
})
output$plotFileB <- renderPlotly({
test.out <- data1()
...
})
output$mytable1 = renderDataTable({
test.out <- data1()
test.out
})
答案 0 :(得分:2)
关于反应性的好处是,如果多次调用data1()
,但输入没有改变,data1
内的代码实际上不会多次运行。它只会运行一次。这是反应变量的主要思想 - 它们会缓存它们的价值,这意味着如果你在没有任何输入改变的情况下调用它们100次,它们只评估一次,接下来的99次它们只是立即返回它们记住的值。因此,每次调用data1()
时,数据实际上都不会被重新加载。您可以通过在print()
中添加data1
语句来说服自己,并确保它只打印一次。
我建议对反应变量和反应性做一些阅读以内化这个概念。本教程(免责声明:我写的)可以成为这个主题的一个很好的资源:Reactivity 101