反应内容来源Shiny

时间:2015-10-23 09:59:43

标签: r shiny

我想将我的应用程序分成更小的安静,以便更好地处理。

server.R

library(shiny)
source("onLoad.R", local = TRUE)

  shinyServer(function(input, output, session) {

     sourceRecursive("/.../")

 })

sourceRecursive

#check folder and all subfolders for .R files
#source() them! 
sourceRecursive <- function(path) {
      dirs <- list.dirs()
      files <- dir(pattern = "^.*[Rr]$", include.dirs = FALSE)
      for (f in files)
          source(f)
      for (d in dirs)
          sourceRecursive(d)
 }

我试图获取示例文件。 file.R

output$myChoices <- renderUI({
    selectInput(inputId = 'x', 
            label = 'y', 
            choices = levels(myDataSet$df$z),
            multiple = T
    )
})

反弹:

  

输出错误$ myChoices&lt; - renderUI({:     对象&#39;输出&#39;找不到

显然问题是在file.R内没有定义变量output,因为这是一个在闪亮的上下文中使用的变量。我如何告诉R(或闪亮)将所有变量视为闪亮的定义变量(例如output$whateverinput$somethingreactive等)。这对我来说似乎至关重要,以便将该计划分解为更小的和平。

2 个答案:

答案 0 :(得分:0)

如果您在源代码调用中使用local=TRUE,前提是sourceRecursive位于正确的范围内(可能将其放在server.R中),该怎么办?请参阅此文档here

答案 1 :(得分:0)

我使用source(local = TRUE)和sys.source将文件加载到适当的环境中,它似乎有效:

library(shiny)
shinyServer(function(input, output, session) {
    # From http://shiny.rstudio.com/articles/scoping.html
    output$text <- renderText({
        source('each_call.R', local=TRUE)
    })

    # Source in the file.R from the example in the question
    sys.source('file.R', envir=environment())
})

我没有测试过,但您可以使用:

sourceRecursive <- function(path, env) {
    files <- list.files(path = path, pattern = "^.*[Rr]$", recursive = TRUE)
    for (f in files) sys.source(f, env)
}

shinyServer(function(input, output, session) {
    session.env <- environment()
    sourceRecursive(path = ".", env = session.env)
})