反应环境中的源R文件(闪亮)

时间:2015-10-15 21:23:11

标签: r shiny

初学者有光泽的问题。

我有两个模型位于不同的文件夹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 个答案:

答案 0 :(得分:1)

这将取决于您拥有&#39;型号的地方。文件夹存储。因此,假装它与闪亮的应用程序位于同一目录中。下面是一些应该重新创建这种情况的代码,以及两个单独文件夹中的一些模型和数据。只需将变量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))