我想将我的应用程序分成更小的安静,以便更好地处理。
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$whatever
,input$something
,reactive
等)。这对我来说似乎至关重要,以便将该计划分解为更小的和平。
答案 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)
})