Shiny中的作用域
所有这些都很大程度上取决于您在何处调用source()
。如果您需要从UI和服务器函数内找到数据,则将source()
放在应用程序之外。
如果您将source()
放在服务器函数内部,则UI将无法找到脚本创建的任何对象。如果您将其放在渲染函数内部,则这些对象仅在该渲染函数内部可见。请参阅 Shiny的作用域规则
请注意,如果您有单独的server.R和ui.R文件,并且希望UI找到脚本创建的对象,则应将global.R
文件添加到应用程序目录中。然后将source()
命令放在global.R
文件中。
以下是一个简单的示例:
source('testScript.R')
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(x)),
dataTableOutput("what")),
function(input, output, session){
output$what <- renderDataTable(x)
}
)
而且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))
}
)
source('procesadoDatos.R',encoding =“ utf-8”,local = TRUE)
。然后我运行此脚本并启动闪亮的应用程序,它有效。但是,当我将我的R项目上传到Linux服务器时,我尝试做同样的事情,但它不让我运行全局脚本.R。这不是关于用户权限的问题,因为所有文件都具有相同的权限,我可以运行其他R脚本... 因此,当我在服务器上启动闪亮的应用程序时,我得到与以前相同的错误。 - Luis Cano