我的R脚本变化很大,因此我将其分解为一系列由控制器脚本运行的源()R文件。如果我想要一个脚本运行,我创建一个对象并用条件语句包装source() - ed脚本。我想使用闪亮的可编程小部件来控制输入,但我仍然希望能够通过RStudio自由运行代码。为了在R中运行它,我创建了一个Rlauncher脚本,您可以在其中手动设置对象参数和source()控制器脚本。不幸的是,对于SHINYlauncher(server.R),包装的actionButton()需要隔离所有输入并运行脚本,这要求代码在有光泽的.GlobalEnv中运行。我想出了一个部分解决方案来运行server.R与原始脚本并行,但我无法绕过源() - .GlobalEnv中的控制器脚本。有关如何在parent.frame()中运行环境以运行控制器脚本的任何帮助都会很棒!
这是我的原始代码。如果我在运行控制器脚本时将对象加载到.GlobalEnv上,一切正常,但是我需要WEEKS来渲染一批地图......
shinyServer(function(input, output, session) {
observe({
if (input$actnBut_runController==0) {return} else{
isolate({
tmp.env <- new.env()
run_script1 <- input$run_script1
run_script2 <- input$run_script2
run_script3 <- input$run_script3
assign("run_script1",run_script1,envir=tmp.env)
assign("run_script2",run_script2,envir=tmp.env)
assign("run_script3",run_script3,envir=tmp.env)
save(list=ls(all.names=TRUE,pos=tmp.env),envir=tmp.env,file="obs.RData")
rm(tmp.env)
})
print("Running sourced scripts...")
source("controller.R"),echo=TRUE)
}
})
此代码模仿我从其他工作示例中看到的并行编码。它将创建对象并运行控制器脚本,但我仍然无法在parent.frame()中运行它。
shinyServer(function(input, output, session) {
iso_obs <- function() {
Sys.sleep(1)
shiny::isolate({
tmp.env <- new.env()
run_script1 <- input$run_script1
run_script2 <- input$run_script2
run_script3 <- input$run_script3
assign("run_script1",run_script1,envir=tmp.env)
assign("run_script2",run_script2,envir=tmp.env)
assign("run_script3",run_script3,envir=tmp.env)
save(list=ls(all.names=TRUE,pos=tmp.env),envir=tmp.env,file="obs.RData")
rm(tmp.env)
})}
runController <- reactive({
if (input$actnBut_runController==0) {return} else {
iso_obs()
print("Running sourced scripts...")
source("controller.R"),echo=TRUE)
}})
此代码还会创建对象,但不会正确运行控制器脚本。我试图为同一个输入执行两个函数,其中source() - ed代码是一个延迟函数。
shinyServer(function(input, output, session) {
observe({
if (input$actnBut_runController==0) {return} else{
isolate({
tmp.env <- new.env()
run_script1 <- input$run_script1
run_script2 <- input$run_script2
run_script3 <- input$run_script3
assign("run_script1",run_script1,envir=tmp.env)
assign("run_script2",run_script2,envir=tmp.env)
assign("run_script3",run_script3,envir=tmp.env)
save(list=ls(all.names=TRUE,pos=tmp.env),envir=tmp.env,file="obs.RData")
rm(tmp.env)
})
}
})
runController <- reactive({
if (input$actnBut_runController==0) {return} else {
Sys.sleep(1) # This is to delay the R environment so .GlobalEnv can create objects
print("Running sourced scripts...")
source("controller.R"),echo=TRUE)
}
})
答案 0 :(得分:0)
您可能需要在“source()”函数调用中添加“local = TRUE”选项。