2015-10-15 33 views
1

初学者闪亮的问题。被动背景下的源R文件(闪亮)

我有两个型号住在不同的文件夹,AB,都被称为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

这将取决于你的'模型'文件夹存储在哪里。所以,假装它与你闪亮的应用程序在同一个目录中。下面是一些应该重现这种情况的代码,以及两个单独文件夹中的一些模型和数据。只要将变量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存在问题,如下图所示。在本例中,我使用mget()捕获来源input.R文件中的所有变量。

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