初学者有光泽的问题。
我有两个模型位于不同的文件夹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)
})
}
这不起作用。任何想法将不胜感激。
答案 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))