首页 > 解决方案 > 根据 ui 输入选择读取 CSV

问题描述

我无法.csv根据 ui 输入动态读取文件。

我对不同地区的降水和温度数据进行了观察(此处 ID 为zone)。对于这些相同区域的一个子集,我也有高程观测的频率数据。该应用程序旨在作为具有多个区域的区域的这三个测量值的 CDF 绘图仪。

问题是海拔频率数据的分辨率比降水和温度数据(一起p_t)要高得多,而且每当用户选择海拔数据()时,我的代码效率太低,无法获得良好的 Shiny 性能elev

与其让一个全局可用data.frame的所有数据可过滤,我希望让 Shiny只为(via ).csv中选择的区域动态抓取频率高程数据的各个 s 。一旦它们被读入, 所以它们是观察格式,然后将它们与所选的任何降水或温度(观察)数据捆绑在一起,以便使用美学设置为和的便捷功能。input$zoneSelectizeInputuncount()data.frame data()ggplotstat_ecdf()data()$paramdata()$zone

这听起来像一个好的方法吗?如果是这样,你能帮帮我吗?总之,主要需要是,如果选择了参数,则让 Shiny 查找并读取文件名与所选区域匹配的elev那些海拔。.csv提前感谢您的帮助。

library(tidyverse)
library(shiny)
library(shinydashboard)


# generate sample observation data - precipitation and temperature
# not many megabytes so will just read in all at once at startup as one .csv

zone <- c(rep("abcde", 6), rep("fghij", 6), rep("klmno", 6), 
rep("pqrst", 6))
set.seed(1)
val <- rnorm(24, 12, 18)
param <- rep(c("p", "t"), 12)
p_t <- data.frame(zone, val, param, stringsAsFactors = FALSE)
#head(p_t)
#   zone        val param
#1 abcde  0.7238314     p
#2 abcde 15.3055798     t
#3 abcde -3.0413150     p
#4 abcde 40.7150544     t
#5 abcde 17.9311399     p
#6 abcde -2.7684309     t

# generate sample elevation frequency data with many more observations - 
# need to be stored as individual .csvs, too big to read in, uncount, and 
# filter by input - too slow
# just want to bind and uncount as they're selected by user


setwd(./elevdata) # separate folder from which to pick out the elev data .csv in the main wd
# and prevent reading in of other app .csv data
val <- c(503, 506, 513, 689)
count <- c(32282, 53172, 45237, 34534)
data.frame(val, count) %>% mutate(zone = "abcde", param = "elev") %>% 
                      write_csv("abcde.csv")
val <- c(-36, -39, -51, -98)
count <- c(52220, 5175, 299237, 100034)
data.frame(val, count) %>% mutate(zone = "fghij", param = "elev") %>% 
                       write_csv("fghij.csv")
val <- c(2, 7, 13, 110)
count <- c(99222, 883172, 114237, 8347633)
data.frame(val, count) %>% mutate(zone = "klmno", param = "elev") %>% 
                       write_csv("klmno.csv")

#only a subset of p_t zones have elev data - variable not currently used
#zoneswithelevdata <- list.files(pattern = "*.csv$") 
#zoneswithelevdata <- gsub(".csv", "", zoneswithelevdata)


#shiny app using the above sample data

 shinyApp(

ui = fluidPage(

sidebarLayout(sidebarPanel(

  selectizeInput(
    "zone", "zone", choices = unique(p_t$zone),
    selected = c("a"),
    multiple = TRUE),

  checkboxGroupInput("param", "parameter",
                     choices = c("elev", "p", "t"), selected =c("elev", "p"))
),

mainPanel(

  tabsetPanel(position=c("right"),

              tabPanel(strong("static cdf"), 
                       br(),
                       plotOutput("reg_plot",  height = "750px"))    )))

),

server = function(input, output) {

# elev_csv_counts_tobind <- reactive({ 
# if `elev` parameter is checked:
#* read_csv() of the csv(s) with csv file name %in% input$zone ** 
# * and bind together
#})

data <- reactive({

  p_t_e <- p_t %>%
   #first subset p_t by the zone(s) and param(s) selected      
   filter(param %in% input$param,
           zone %in% input$zone)   %>%
  #now attach and uncount the elevation data
    bind_rows({elev_csv_counts_tobind %>%
        uncount(count)})                       
})

output$reg_plot <- renderPlot({

  ggplot(data(), aes(val, color = param, linetype = zone)) +
    labs(y = "proportion of total", x = NULL) +
    stat_ecdf(pad = FALSE)  + coord_flip()
})
}  
)

在此处输入图像描述

标签: rshiny

解决方案


推荐阅读