我开发了一个闪亮的应用程序,其中显示了一些动态图表。这些图表是在执行时根据某些按钮的值生成的。这个闪亮的应用程序从原始csv获取数据,该csv之前已经过处理和转换。除了出色的应用程序外,我还获得了一个Rscript来进行原始数据的所有这些“转换”。我想做的是从闪亮的应用程序调用此Rscript,以便在启动闪亮的应用程序时执行该脚本。
我已经检查了这些链接,但根本没有帮助:如何在R中将R Script与Shiny应用程序连接?而这个在Shiny中使用Source()。我也检查了Rstudio文档:http ://shiny.rstudio.com/tutorial/lesson5/ 。
我认为应该是这样,RScript是procesadoDatos.R。我只希望源命令在开始时执行,以便在闪亮的应用程序开始时加载数据:
source("procesadoDatos.R",local = TRUE)
shinyServer(function(input, output,session) {
(renderplots, reactives elements and so on)}
Run Code Online (Sandbox Code Playgroud)
Rscript是server.R和UI.R文件的闪亮项目路径。我也尝试过添加路径,但是它也不起作用。
我尝试过的另一件事是创建一个进行所有转换的函数,然后在采购它之后从server.R文件中调用它:
source("procesadoDatos.R",local = TRUE)
generate_data(ticketsByService_report10.csv)
Run Code Online (Sandbox Code Playgroud)
在RScript中定义此函数的generate_data:
generate_data <- function(csv_file) {
(all those transformation, data frame an so on)}
Run Code Online (Sandbox Code Playgroud)
在所有情况下,我都会遇到相同的错误,即找不到在RScript中生成的数据帧。
有人知道哪里出问题了吗?提前感谢
所有这些在很大程度上取决于您确切的呼叫位置source()。如果需要在UI和服务器功能中都可以找到数据,可以将其放在source()应用程序外部。
如果放置source()在服务器功能内部,则UI将无法找到该脚本创建的任何对象。如果将其放在渲染函数中,则对象仅在该渲染函数中可见。另请参阅“闪亮”的作用域规则
请注意,如果您有单独的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)
}
)
Run Code Online (Sandbox Code Playgroud)
并testScript.R包含一行:
x <- iris
Run Code Online (Sandbox Code Playgroud)
这里的关键是:
因此,如果您可以执行以下操作:
shinyApp(
fluidPage(
selectInput("cols", "pick columns",
choices = names(x)),
dataTableOutput("what")),
function(input, output, session){
source('testScript.R', local = TRUE)
output$what <- renderDataTable(x)
}
)
Run Code Online (Sandbox Code Playgroud)
您会收到有关无法找到的错误消息x。这是正常的,因为x现在仅在服务器功能的环境中定义。
您仍然可以这样做:
shinyApp(
fluidPage(
dataTableOutput("what")),
function(input, output, session){
source('R/testScript.R', local = TRUE)
output$what <- renderDataTable(x)
}
)
Run Code Online (Sandbox Code Playgroud)
请注意x,只需要在服务器功能内部而不是在UI内部。
对于功能,同样适用。您将函数定义放在脚本中并像以前一样获取源代码。函数不过是对象而已,因此脚本实际上创建了一个函数对象,然后可以使用完全相同的作用域规则找到该对象。
请记住,如果要使用该函数的结果,则此函数应返回某些内容。所以把这个琐碎的例子放在testScript.R:
myfun <- function(x){
tmp <- iris[x]
return(tmp)
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以执行以下操作:
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))
}
)
Run Code Online (Sandbox Code Playgroud)
如果将source()放在服务器函数中,则此方法不再起作用。用户界面侧将无法再看到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"
Run Code Online (Sandbox Code Playgroud)