从Shiny App调用R脚本

时间:2017-06-13 14:38:37

标签: r shiny rscript

我开发了一个闪亮的应用程序,显示一些动态图表。这些图表是在执行时根据某些按钮的值生成的。这个闪亮的应用程序从以前处理和转换的原始csv获取数据。我从一个闪亮的应用程序中获得了一个Rscript来完成原始数据的所有“转换”。我想做的是从闪亮的应用程序调用此Rscript,以便在启动闪亮的应用程序时执行。

我已经检查了这些链接,但它根本没有帮助:How can I connect R Script with Shiny app in R?和这一个using Source() in Shiny。我也检查了Rstudio文档:http://shiny.rstudio.com/tutorial/lesson5/

我认为它应该是这样的,作为PROGRadoDatos.R的RScript。我只是想在开始时执行source命令,以便在闪亮的应用程序启动时加载数据:

 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)

生成_data这个函数在RScript中定义:

 generate_data <- function(csv_file) {
 (all those transformation, data frame an so on)}

在所有情况下,我都得到了同样的错误,说没有找到在RScript中生成的数据帧。

有谁知道出了什么问题?谢谢你

1 个答案:

答案 0 :(得分:5)

在Shiny

中确定范围

这一切在很大程度上取决于你究竟在哪里调用source()。如果您需要在UI和服务器功能中找到数据,则将source()放在应用程序之外。

如果将source()放在服务器功能中,UI将无法找到脚本创建的任何对象。如果将其放在渲染函数中,则对象仅在该渲染函数内可见。另请参阅Scoping rules for Shiny

注意如果您有单独的server.R和ui.R文件,并且您希望UI找到脚本创建的对象,则应该向您的global.R文件添加app目录。然后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

这里的关键是:

  1. 脚本实际上必须创建这些对象
  2. 脚本应该来自正确的位置。
  3. 因此,如果您可以执行以下操作:

    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"