Shiny分文件结构下server.R无法读取全局变量的原因咨询
Shiny双文件与单文件运行差异的原因
双文件结构(./app目录)
ui.R 代码
library(shiny) a <- 1 ui <- fluidPage( textOutput("test") )
server.R 代码
server <- function(input, output) { output$test <- renderText({ a }) }
运行命令
shiny::runApp("app")
报错信息
Warning: Error in cat: argument 1 (type 'closure') cannot be handled by 'cat' 102: cat 98: transform 97: func 95: f 94: Reduce 85: do 84: hybrid_chain 83: renderFunc 82: output$test 1: shiny::runApp
单文件正常运行代码
library(shiny) a <- 1 ui <- fluidPage( textOutput("test") ) server <- function(input, output) { output$test <- renderText({ a }) } shinyApp(ui = ui, server = server)
差异原因
这是因为Shiny双文件模式和单文件模式的代码运行环境完全不同:
- 用
runApp("app")启动双文件结构时,ui.R的代码会运行在你的全局R环境里,但server.R的代码会被加载到Shiny专门创建的独立服务器环境中,两个环境是隔离的。 - 你在
ui.R里定义的变量a <- 1只存在于全局环境,server.R里的函数根本访问不到这个变量。此时服务器环境里找不到你定义的a,就会向上查找,最终匹配到了某个R包中同名的内置函数(也就是报错里说的closure类型),而renderText需要的是可打印的数值/文本,传入函数自然就报错了。 - 单文件模式下,所有代码都在同一个环境里执行,
server函数可以直接访问同一环境中定义的a变量,所以能正常输出数值1。
如果要让双文件模式正常运行,你可以在./app目录下新建一个global.R文件,把a <- 1放在这个文件里——Shiny启动时会先加载global.R,里面的变量会同时被ui和server环境共享。
内容的提问来源于stack exchange,提问作者DragonFly
相关产品推荐
相关产品推荐

