首页 > 解决方案 > R Shiny 数据分析:我正在努力从我上传的 .csv 文件中渲染一个图

问题描述

我正在 R Shiny 中构建可靠性数据分析工具。我对 R 很陌生(几年前用过一次),对 Shiny 很陌生。我无法通过教程或论坛解决这个问题:(

基本上,我希望用户上传失败事件表的 .csv 文件。该表有四列(i、Xi、Ci 和 Ti)并且可以有任意数量的行。

首先,我想以表格形式显示数据。我模型的这一部分目前有效。

然后,我想绘制 Ti vs i 的图。我已经为它编写了代码(我尝试了很多次迭代,当前代码如下),但我没有尝试过任何工作。

稍后,我将想使用数据执行统计操作(从拉普拉斯趋势测试开始),我还不确定该怎么做(例如,我如何指定我在什么时候使用的列/行/数据项执行操作?)。

下面是当前的 R 代码(我已经删除了不相关的部分):

library(shiny)
library(ggplot2)
library(tidyverse)

ui <- fluidPage(
  
  #App title
  titlePanel("Reliability Data Analysis Tool"),
  
  tabsetPanel(
    
    tabPanel("Model selection", fluid = TRUE,
             sidebarLayout(
               
               sidebarPanel(
                 
                 "Welcome to the RShiny Reliability Data Analysis tool. 
                 To begin, please upload a valid events table file.", HTML('<br/>'),HTML('<br/>'),
                 
                 
                 #Allow user to input events table in .csv format
                 fileInput(
                   inputId = "fileEventsTable",
                   label = "Upload an events table", 
                   accept = ".csv"),
                 
                 #Indicate whether or not data includes headers   
                 checkboxInput("header", "Header", TRUE),
                 
                 
               ),
               
               mainPanel(
                 
                 h4("Events table"),
                 
                 h5("Key"),
                 "i = Observation number,",
                 "Xi = Interarrival time,",
                 "Ci = Failure indication,",
                 "Ti = Global time",
                 
                 #Display events table
                 tableOutput("eventsTableContents"),
                 
                 HTML('<br/>'),
                 
                 h4("Cumulative failure plot"),
                 
                 #Display cumulative failure plot 
                 plotOutput("eventsTablePlot")
                 
               )))))
                 
server <- function(input, output) {
                   
                   #Read .csv file as a data frame
                   eventsdataframe<-reactive({
                     if (is.null(input$fileEventsTable))
                       return(NULL)                
                     data<-read.csv2(input$fileEventsTable$datapath)
                   })
                   
                   #Render table from events table data frame
                   output$eventsTableContents <- renderTable({
                     eventsdataframe()
                   })
                   
                   #Render plot from events table data frame
                   output$eventsTablePlot <- renderPlot({
                     ggplot(data = eventsdataframe()  +
                              geom_point(aes(x=eventsdataframe$Ti,y=eventsdataframe$i,size=10)))
                     
                   })
                 }
                 
shinyApp(ui = ui, server = server)              
                 

这是我在运行它并上传适当的 .csv 文件时得到的当前输出:

截屏

请注意错误:二进制运算符的非数字参数,我希望散点图在其中。

任何帮助/见解将不胜感激!

标签: rdataframeplotshinyrender

解决方案


我认为反应性数据框存在问题,因此我使用observeEvent了反应性值,然后isolate将其用于读取我使用过的数据,observeEvent而不是使用它 进行了一些小的更改,并且应用程序运行良好。read.csv2read.csv

你试试这个,我认为它符合你的目的。

library(shiny)
library(ggplot2)
library(tidyverse)

ui <- fluidPage(
  
  #App title
  titlePanel("Reliability Data Analysis Tool"),
  
  tabsetPanel(
    
    tabPanel("Model selection", fluid = TRUE,
             sidebarLayout(
               
               sidebarPanel(
                 
                 "Welcome to the RShiny Reliability Data Analysis tool. 
                 To begin, please upload a valid events table file.", HTML('<br/>'),HTML('<br/>'),
                 
                 
                 #Allow user to input events table in .csv format
                 fileInput(
                   inputId = "fileEventsTable",
                   label = "Upload an events table", 
                   accept = ".csv"),
                 
                 #Indicate whether or not data includes headers   
                 checkboxInput("header", "Header", TRUE)),
               
               mainPanel(
                 
                 h4("Events table"),
                 
                 h5("Key"),
                 "i = Observation number,",
                 "Xi = Interarrival time,",
                 "Ci = Failure indication,",
                 "Ti = Global time",
                 
                 #Display events table
                 tableOutput("eventsTableContents"),
                 
                 HTML('<br/>'),
                 
                 h4("Cumulative failure plot"),
                 
                 #Display cumulative failure plot 
                 plotOutput("eventsTablePlot")
                 
               )))))

server <- function(input, output) {
  
  #Read .csv file as a data frame
  eventsdataframe<-reactive({
    req(input$fileEventsTable)
    data<-read.csv(input$fileEventsTable$datapath)
  })
  
  #df <- eventsdataframe()
  
  #Render table from events table data frame
  output$eventsTableContents <- renderTable({
    eventsdataframe()
  })
  
  #Render plot from events table data frame
  observeEvent(eventsdataframe(), {
    req(eventsdataframe())
    
    ddf <- isolate(eventsdataframe())
    
    output$eventsTablePlot <-renderPlot({
      
      ggplot(data =ddf, aes(x=ddf$Ti,y=ddf$i,size=10))+
        geom_point()
      
      })
  })
}

shinyApp(ui = ui, server = server)              

我已经用虚拟数据对其进行了测试App_image


推荐阅读