我在Shiny中创建了一个简单的GUI,用于读取一堆csv文件,然后根据每个csv第5列中的值进行过滤。然而,我不知道如何访问正确的闪亮环境。例如,在服务器功能中,我首先读取带有以下行的文件:
for (i in all_paths) {
n <- basename(i)
temp = list.files(path = i, pattern="*.csv",full.names = TRUE)
list2env(
lapply(setNames(temp, make.names(gsub(".*FRSTseg*", n, temp))),
read.csv), envir = .GlobalEnv)
}
然后用过滤
Pattern1<-grep("*.csv",names(.GlobalEnv),value=TRUE)
all_data<-do.call("list",mget(Pattern1))
newdfs <- lapply(all_data, function(x) subset(x, x[, 5] > 0))
list2env(newdfs,globalenv())
当我运行该应用程序时,我收到一条错误消息,说它找不到我的一个csv的值,我发现它是Pattern1
列表的第一个元素。所以我很确定这个应用程序在Pattern1
行之后就失败了。
我认为问题是csv文件没有被读取到正确的环境中,因此all_data <- do.call...
行不知道该在哪里查找。所以不用。GlobalEnv和GlobalEnv,我应该使用什么?感谢您的帮助!
我们可以使用reactiveValues
并存储read_csv
的结果,以便在应用程序中的所有观察程序中都可用。我创建了一个小应用程序,可以读取项目目录中不同.csv文件的第5列。在这种情况下,所有数据都将存储在一个名为column_read$files
的对象中,该对象可以在任何观察者或反应器中调用。
应用程序:
library(tidyverse)
library(shiny)
set.seed(15)
#create the data
paste0('iris', 1:5, '.csv') %>%
map(~write_csv(x = slice_sample(iris,n = 10), .x))
ui <- fluidPage(
actionButton('read_files', "Read Files"),
textOutput('columns_print')
)
server <- function(input, output, session) {
columns_read <- reactiveValues(files = NULL)
observeEvent(input$read_files, {
files <- list.files(pattern = "*.csv",full.names = TRUE)
columns_read$files <- map(files, ~read_csv(.x, col_select = 5))
})
output$columns_print <- renderPrint({
req(columns_read$files)
columns_read$files
})
}
shinyApp(ui, server)