我试图生成一个Rshiny 的应用程序,其中用户可以 Select 多个xlsx文件,使用rind函数将它们堆叠在一起,在生成曲线图之前过滤数据集.

我收到错误的代码如下:

ui <- fluidPage(
    titlePanel("Charts"),
    sidebarLayout(
        sidebarPanel(
            fileInput(inputId="files", label = "Select XLSX files", multiple = TRUE))),
        mainPanel(
            tabsetPanel(
                tabPanel("Plot", plotOutput("plot1"))
    ))))

server <- function(input,output){
    data <- reactive({
        data=lapply(input$files$datapath, read_xlsx)
        data <- do.call(rbind, data)

        if(is.null(data)){
            return(NULL)
        }

        data %>% 
            filter(Variable %in%   c('A','B,'C')) %>% 
            select(Variable, `Name`,`Calconc`) %>% 
            filter(Name %in% c('D','E','F','G')) %>% 
    })
    output$plot1 <- renderPlot({
        data() %>% 
            filter(Variable=="A") %>% 
            ggplot(aes(x = Name, y = Calconc))         
    })
}
shinyApp(ui=ui, server=server)

Error:个 警告:UseMethod中出错:没有适用于"Null"类的对象的"Filter"方法

推荐答案

以下是我们如何做到这一点:

我已经创建了两个虚拟的xlsx文件:


df1 <- data.frame(
  Variable = c("A", "B", "C", "D", "E", "F", "G"),
  Name = c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7"),
  Calconc = c(0.5, 1.2, 0.9, 1.8, 2.3, 3.1, 4.5)
)

df2 <- data.frame(
  Variable = rev(c("A", "B", "C", "D", "E", "F", "G")),
  Name = rev(c("Name1", "Name3", "Name1", "Name4", "Name1", "Name6", "Name7")),
  Calconc = c(8.5, 9.2, 0.8, 1.8, 2.3, 3.1, 8.5)
)

library(writexl)

write_xlsx(df1, "df1.xlsx")
write_xlsx(df2, "df2.xlsx")

我还对您的代码进行了一些调整:现在我们有了一个显示xlsx数据的选项卡. 为了获得曲线图,我注释掉了滤镜函数:

library(shiny)
library(readxl)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  titlePanel("Charts"),
  sidebarLayout(
    sidebarPanel(
      fileInput(inputId="files", label = "Select XLSX files", multiple = TRUE)
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("Plot", plotOutput("plot1")
                 ),
        tabPanel("data", DT::DTOutput("data"))
      )
    )
  )
)

server <- function(input, output) {
  data <- reactive({
    req(input$files)
    data <- lapply(input$files$datapath, read_xlsx)
    if(length(data) == 0) {
      return(data.frame()) # return empty data frame when no files are selected
    }
    data <- do.call(rbind, data)
    data %>%
     # filter(Variable %in% c('A','B','C')) %>%
      select(Variable, Name, Calconc) # %>%
     # filter(Name %in% c('D','E','F','G'))
  })
  
  output$plot1 <- renderPlot({
    data() %>%
      filter(Variable == "A") %>%
      ggplot(aes(x = Name, y = Calconc)) +
      geom_point()
  })
  
  output$data <- DT::renderDT({
    data()
  })
}

shinyApp(ui=ui, server=server)

R相关问答推荐

根据固定值范围在tible中添加新行

如果行和大于值,则过滤

如何使用R对每组变量进行随机化?

删除列表中存储的数据帧内和数据帧之间的重复行

如何直接从R中的风险分数计算c指数?

R根据条件进行累积更改

如果可能,将数字列转换为整数,否则保留为数字

打印XTS对象

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

如何对r中包含特定(未知)文本的行求和?

使用ggplot2中的sec_axis()调整次轴

有没有办法将不等长的列表转换为R中的数据帧

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

构建一个6/49彩票模拟系统

生存时间序列的逻辑检验

把代码写成dplyr中的group_by/摘要更简洁吗?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

删除r中每个因素级别的最后2行

如何在类应用函数中访问函数本身