从 Shiny App 调用 R 脚本
call R script from Shiny App
我开发了一个闪亮的应用程序,它显示了一些动态图表。这些图表是在执行时根据某些按钮的值生成的。这个闪亮的应用程序从以前处理和转换的原始 csv 中获取数据。除了闪亮的应用程序之外,我还得到了一个 Rscript 来处理所有这些 "transformations" 的原始数据。我想做的是从闪亮的应用程序调用这个 Rscript,以便在闪亮的应用程序启动时执行。
我已经检查了这些链接,但根本没有帮助:How can I connect R Script with Shiny app in R? and this one using Source() in Shiny. I checked the Rstudio documentation too: http://shiny.rstudio.com/tutorial/lesson5/。
我认为它应该是这样的,作为 procesadoDatos.R RScript。我只想在开始时执行源命令,以便在闪亮的应用程序启动时加载数据:
source("procesadoDatos.R",local = TRUE)
shinyServer(function(input, output,session) {
(renderplots, reactives elements and so on)}
Rscript 是 server.R 和 UI.R 文件的闪亮项目路径。我也试过包括路径,但它也没有用。
我尝试的另一件事是创建一个进行所有转换的函数,然后在获取它之后从 server.R 文件中调用它:
source("procesadoDatos.R",local = TRUE)
generate_data(ticketsByService_report10.csv)
正在generate_data RScript 中定义此函数:
generate_data <- function(csv_file) {
(all those transformation, data frame an so on)}
在所有情况下,我都遇到相同的错误,指出未找到在 RScript 中生成的数据帧。
有谁知道哪里出了问题?提前致谢
闪亮的范围
所有这一切在很大程度上取决于您调用 source()
的确切位置。如果您需要从 UI 和服务器功能中找到数据,请将 source()
放在应用程序之外。
如果将 source()
放在服务器函数中,UI 将无法找到脚本创建的任何对象。如果将它放在渲染函数中,则对象仅在该渲染函数中可见。另见 Scoping rules for 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.
内部
使用函数
对于函数,同样适用。您将函数定义放在脚本中并像以前一样获取它。一个函数就是一个对象,所以脚本实质上创建了一个函数对象,然后可以使用完全相同的范围规则找到它。
请记住,如果您想使用该函数的结果,该函数应该 return 一些东西。所以把这个简单的例子放在 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"
我开发了一个闪亮的应用程序,它显示了一些动态图表。这些图表是在执行时根据某些按钮的值生成的。这个闪亮的应用程序从以前处理和转换的原始 csv 中获取数据。除了闪亮的应用程序之外,我还得到了一个 Rscript 来处理所有这些 "transformations" 的原始数据。我想做的是从闪亮的应用程序调用这个 Rscript,以便在闪亮的应用程序启动时执行。
我已经检查了这些链接,但根本没有帮助:How can I connect R Script with Shiny app in R? and this one using Source() in Shiny. I checked the Rstudio documentation too: http://shiny.rstudio.com/tutorial/lesson5/。
我认为它应该是这样的,作为 procesadoDatos.R RScript。我只想在开始时执行源命令,以便在闪亮的应用程序启动时加载数据:
source("procesadoDatos.R",local = TRUE)
shinyServer(function(input, output,session) {
(renderplots, reactives elements and so on)}
Rscript 是 server.R 和 UI.R 文件的闪亮项目路径。我也试过包括路径,但它也没有用。
我尝试的另一件事是创建一个进行所有转换的函数,然后在获取它之后从 server.R 文件中调用它:
source("procesadoDatos.R",local = TRUE)
generate_data(ticketsByService_report10.csv)
正在generate_data RScript 中定义此函数:
generate_data <- function(csv_file) {
(all those transformation, data frame an so on)}
在所有情况下,我都遇到相同的错误,指出未找到在 RScript 中生成的数据帧。
有谁知道哪里出了问题?提前致谢
闪亮的范围
所有这一切在很大程度上取决于您调用 source()
的确切位置。如果您需要从 UI 和服务器功能中找到数据,请将 source()
放在应用程序之外。
如果将 source()
放在服务器函数中,UI 将无法找到脚本创建的任何对象。如果将它放在渲染函数中,则对象仅在该渲染函数中可见。另见 Scoping rules for 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.
使用函数
对于函数,同样适用。您将函数定义放在脚本中并像以前一样获取它。一个函数就是一个对象,所以脚本实质上创建了一个函数对象,然后可以使用完全相同的范围规则找到它。
请记住,如果您想使用该函数的结果,该函数应该 return 一些东西。所以把这个简单的例子放在 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"