1

我的 R 脚本是高度可变的,因此我将其分解为一系列由控制器脚本运行的 source() 编辑的 R 文件。如果我想运行一个脚本,我会创建一个对象并使用条件语句包装 source()-ed 脚本。我想使用闪亮的可编程小部件来控制输入,但我仍然希望能够自由地通过 RStudio 运行代码。为了在 R 中运行它,我创建了一个 Rlauncher 脚本,您可以在其中手动设置对象参数和 source() 控制器脚本。不幸的是,使用 SHINYlauncher (server.R),隔离所有输入和运行脚本所需的包装 actionButton() 需要代码在闪亮的 .GlobalEnv 中运行。我想出了一个部分解决方案来运行服务器。R 与原始脚本平行,但我无法绕过 source()-ing .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() 编辑的代码是一个延迟函数。

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)
}
})
4

1 回答 1

0

您可能需要在“source()”函数调用中添加“local=TRUE”选项。

于 2014-06-17T20:02:43.487 回答