闪亮的范围
所有这一切很大程度上取决于您到底在哪里打电话source()
。如果您需要从 UI 和服务器功能中查找数据,您可以将source()
在应用程序之外。
如果你放置source()
在服务器函数内部,UI 将无法找到脚本创建的任何对象。如果将其放入渲染函数内,则对象仅在该渲染函数内可见。也可以看看Shiny 的范围规则
Note如果您有单独的 server.R 和 ui.R 文件,并且希望 UI 找到脚本创建的对象,则应该添加global.R
文件到您的应用程序目录。这source()
然后命令进入global.R
file.
一个小例子:
source('testScript.R')
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(x)),
dataTableOutput("what")),
function(input, output, session){
output$what <- renderDataTable(x)
}
)
and testScript.R
包含一行:
x <- iris
这里的关键是:
- 脚本实际上必须创建这些对象
- 该脚本应该来自正确的位置。
因此,如果您可以执行以下操作:
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(x)),
dataTableOutput("what")),
function(input, output, session){
source('testScript.R', local = TRUE)
output$what <- renderDataTable(x)
}
)
您收到有关无法找到的错误x
。这很正常,因为x
现在仅在服务器函数的环境中定义。
不过你仍然可以这样做:
shinyApp(
fluidPage(
dataTableOutput("what")),
function(input, output, session){
source('R/testScript.R', local = TRUE)
output$what <- renderDataTable(x)
}
)
注意如何x
仅在服务器功能内部需要,在 UI 内部不需要。
使用函数
对于函数来说,同样的情况也适用。您将函数定义放入脚本中并像以前一样获取它。函数只不过是一个对象,因此脚本本质上创建了一个函数对象,然后可以使用完全相同的作用域规则找到该对象。
请记住,如果您想使用函数的结果,则该函数应该返回一些内容。所以把这个简单的例子放在testScript.R
:
myfun <- function(x){
tmp <- iris[x]
return(tmp)
}
现在您可以执行以下操作:
source('testScript.R', local = TRUE)
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(myfun())),
dataTableOutput("what")),
function(input, output, session){
output$what <- renderDataTable(myfun(input$cols))
}
)
如果您将 source() 放在服务器函数中,这将不再起作用。 UI端看不到myfun()
不再有。
rm(list = ls())
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(myfun())),
dataTableOutput("what")),
function(input, output, session){
source('R/testScript.R', local = TRUE)
output$what <- renderDataTable(myfun(input$cols))
}
)
# Error in myfun() : could not find function "myfun"