从Shiny App调用R脚本

Lui*_*no 3 r rscript shiny

我开发了一个闪亮的应用程序,其中显示了一些动态图表。这些图表是在执行时根据某些按钮的值生成的。这个闪亮的应用程序从原始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中生成的数据帧。

有人知道哪里出问题了吗?提前感谢

Jor*_*eys 7

闪亮范围

所有这些在很大程度上取决于您确切的呼叫位置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)

这里的关键是:

  1. 该脚本实际上必须创建这些对象
  2. 该脚本应在正确的位置获得。

因此,如果您可以执行以下操作:

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)