2013-08-21 1 views
1

Мой скрипт R очень изменчив, поэтому я разбил его на ряд исходных() - ed R файлов, которые запускаются с помощью скрипта контроллера. Если я хочу, чтобы скрипт запускался, я создаю объект и завершаю скрипты source() - ed условным выражением. Я хочу использовать программируемые виджеты для управления входами, но я также хочу иметь возможность запускать код через RStudio. Чтобы запустить его в R, я создал сценарий Rlauncher, где вы можете вручную задать параметры объекта и source() скрипт контроллера. К сожалению, с SHINYlauncher (server.R), завернутый actionButton(), необходимый для изоляции всех входов и запуска скрипта, требует, чтобы код работал в gliny's .GlobalEnv. Я придумал частичное решение для запуска сервера. R параллельно исходному сценарию, но я не могу обойти источник() - скрипт контроллера в .GlobalEnv. Любая помощь в том, как munipulate среды запускать скрипт контроллера в parent.frame(), будет потрясающе!Shiny - Как кодировать параллельную обработку для сценариев source() - ed внутри кнопки действия?

Это мой первоначальный код. Если я загружаю свои объекты на .GlobalEnv при запуске сценария контроллера, все работает, но он берет меня НЕДЕЛИ, чтобы сделать партию карт ...

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

Этот код также создает объекты, но неправильно запускает скрипт контроллера. Я попытался выполнить две функции для одного и того же ввода, где исходный() - код - это функция с задержкой.

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) 
} 
}) 
+3

Используйте функции с аргументами вместо сценариев источников, которые используют глобальные переменные. – hadley

ответ

0

Возможно, вам нужно добавить параметр «local = TRUE» к вызову функции «источник()».