2015-10-15 3 views
1

Новичка Блестящий вопрос.Источник R файла в реактивном контексте (Блестящий)

У меня есть две модели, живущие в разных папках, A и B, как называется inputs.R, и хотите загрузить одну или другую сторону, используя selectInput, чтобы выбрать папку (на самом деле, есть более чем один файл в каждой папке, так Я не хочу загружать файл напрямую).

В настоящее время у меня есть

ui <- fluidPage(selectInput("model_folder", "Select folder", c("A", "B"))) 

server <- function(input, output){ 
    reactive({ 
    inpts <- paste0("models/",input$model_folder, "/inputs.R") 
    source(inpts, local = T) 
    }) 
} 

Это не работает. Любые мысли были бы весьма признательны.

+1

что вы хотите, чтобы произошло, когда вы снабжаем 'inpts'? Вы просто пытаетесь сохранить модель в переменной (т. Е. Результат 'lm' или какой-то такой)? – jenesaisquoi

+0

Существует несколько функций в 'inputs.R' (которые будут иметь разную функциональность между папками A и B), которые я хочу сделать доступными для сеанса. – Jim

+0

, чтобы вы возвращали список переменных? Функции должны возвращать одно значение. – jenesaisquoi

ответ

1

Это будет зависеть от того, где хранится ваша папка «models». Итак, притворитесь, что он находится в том же каталоге, что и ваше блестящее приложение. Вот какой код, который должен воссоздать эту ситуацию, наряду с некоторыми моделями и данными в двух отдельных папках. Просто измените переменную appDir туда, где у вас нет папки.

## Create the models/folders in a temporary location 
## define it in appDir 
appDir <- 'c:/path/to/temp/app' 
dir.create(appDir) 
dir.create(file.path(appDir, "models")) 
for (i in 1:2) { 
    dir.create((folder = file.path(appDir, "models/", LETTERS[i]))) 
    code <- bquote({ 
     dat <- data.frame((x=rnorm(100)), y=rnorm(100, mean=.(i)*x)) 
     mod <- lm(y ~ x, data=dat) 
    }) 
    writeLines(deparse(code), file.path(folder, 'input.R')) 
} 

Затем в новой папке appDir, создать файл app.R, который будет примером приложения. Существуют проблемы с тем, как вы пытаетесь использовать reactive, как показано ниже. В этом примере я фиксирую все переменные из файлов input.R с использованием mget().

library(shiny) 

app <- shinyApp(
    ui = fluidPage(
     selectInput("model_folder", "Select folder", c("A", "B")), 
     uiOutput('info'), 
     tableOutput('summ') 
    ), 
    server = function(input, output) { 
     output$info <- renderUI({ 
      inp <- inpts() 
      list(
       helpText(sprintf("Now looking at variables from %s", inp$name)), 
       radioButtons('vars', 'Variables', choices=names(inp), inline=TRUE) 
      ) 
     }) 

     output$summ <- renderTable({ 
      inp <- inpts() 
      if (input$vars == 'mod') summary(inp$mod) 
     }) 

     inpts <- reactive({ 
      name <- file.path("models", input$model_folder, "input.R") 
      source(name, local=TRUE) 
      mget(ls()) 
     }) 
    } 
) 

Теперь, чтобы запустить его, вы можете просто сделать

library(shiny) 
runApp(appDir = normalizePath(appDir)) 
+0

Очень аккуратно! Спасибо тысячу. – Jim

+0

(примет ответ, как только я получу его на работу) – Jim

+0

Работал! Ты маленький рыхлитель! – Jim

Смежные вопросы