我把全局放在引号中,因为我不希望ui.R可以访问它,只能访问server.R中的每个函数。这就是我的意思:
shinyServer(function(input, output, session) {
df <- NULL
in_data <- reactive({
inFile <- input$file1
if (is.null(inFile)) return(NULL)
else df <<- read.csv(inFile$datapath, as.is=TRUE)
return(NULL)
})
output$frame <- renderTable({
df
})
})
shinyUI(pageWithSidebar(
sidebarPanel(fileInput("file1", "Upload a file:",
accept = c('.csv','text/csv','text/comma-separated-values,text/plain'),
multiple = F),),
mainPanel(tableOutput("frame"))
))
我在shinyServer函数的开头定义了df
,并尝试使用in_data()
赋值在<<-
中更改其全局值。但df
永远不会更改其NULL
作业(因此output$frame
中的输出仍为NULL
)。有没有办法在shinyServer中的函数中更改df
的整体值?我想在server.R中的所有函数中使用df
作为上传数据框,这样我只需要调用input$file
一次。
我查看this帖子,但是当我尝试类似的东西时,错误被抛出,envir = .GlobalENV没有找到。总体目标是仅调用input$file
一次并使用存储数据的变量,而不是重复调用in_data()
。
非常感谢任何帮助!
答案 0 :(得分:3)
使用被动反应的想法是正确的方向;但是你做得不对。我刚刚添加了一行,它正在运行:
shinyServer(function(input, output, session) {
df <- NULL
in_data <- reactive({
inFile <- input$file1
if (is.null(inFile)) return(NULL)
else df <<- read.csv(inFile$datapath, as.is=TRUE)
return(NULL)
})
output$frame <- renderTable({
call.me = in_data() ## YOU JUST ADD THIS LINE.
df
})
})
为什么呢?因为反应对象与函数非常相似,只有在调用它时才会执行。因此,代码的“标准”方式应该是:
shinyServer(function(input, output, session) {
in_data <- reactive({
inFile <- input$file1
if (is.null(inFile)) return(NULL)
else read.csv(inFile$datapath, as.is=TRUE)
})
output$frame <- renderTable({
in_data()
})
})