如何上传文件并命名 R 中 Shiny 中的列?

How to upload a file and name the columns in Shiny in R?

目标

要在读取数据的 Shiny 应用程序中上传文件,命名变量(列)并在呈现绘图输出之前进行一些数据分析

参考 Shiny App

我正在使用 Shiny gallery 中的这个应用程序作为参考:enter link description here

我尝试过的:

我想在做不同的分析后在许多输出中使用上传的数据。因此,我没有在 renderTablerenderPlot 中读取文件,而是在 server 函数中读取它:

server <- function(input, output) {
     inFile <- reactive({input$file1})
     sdf <- reactive({read.csv(inFile()$datapath, header=F)})     

colnames(sdf()) <- c('Vehicle.ID', 'Time', 'Vehicle.class.no', 'Vehicle.type2', 
                         'Vehicle.Length', 'Lane', 'Preceding.Vehicle.ID', 'Spacing','Spacing2', 'State',
                         'svel.mps', 'deltaV.mps', 'sacc', 'lane.change')  }

错误

但是当我 运行 这个应用程序时,我得到:

shiny::runApp('app-CC')

Listening on http://127.0.0.1:7484
Error in colnames(sdf()) <- c("Vehicle.ID", "Time", "Vehicle.class.no",  : 
  invalid (NULL) left side of assignment

问题

我该如何解决这个错误?我不想在每个 render* 函数中再次读取同一个文件。在使用 render* 函数之前,是否有读取新文件、定义列名然后进行一些分析的闪亮应用程序的在线示例?

您最好在 read.csv

期间指定列名
server <- function(input, output) {
     inFile <- reactive({input$file1})
     sdf <- reactive({
         read.csv(inFile()$datapath, header=F, col.names = c('Vehicle.ID', 'Time', 'Vehicle.class.no', 'Vehicle.type2', 
            'Vehicle.Length', 'Lane', 'Preceding.Vehicle.ID', 'Spacing','Spacing2', 'State',
            'svel.mps', 'deltaV.mps', 'sacc', 'lane.change')  
         )
     }) 
}

或者我相信你可以在反应块中执行多个操作,只要你 return 最终对象

server <- function(input, output) {
     inFile <- reactive({input$file1})
     sdf <- reactive({
         dd<-read.csv(inFile()$datapath, header=F)
         colnames(dd) <- c('Vehicle.ID', 'Time', 'Vehicle.class.no', 'Vehicle.type2', 
            'Vehicle.Length', 'Lane', 'Preceding.Vehicle.ID', 'Spacing','Spacing2', 'State',
            'svel.mps', 'deltaV.mps', 'sacc', 'lane.change')  
         )
         dd
     }) 
}

另一种方法是使用 actionButton,然后在上传文件时检查文件的有效性。许多 observeEvent 可能适合在 "triggered," 时触发,例如上传文件或按下按钮。此外,要进行一系列更改,最好有一个 "update" reactiveValue() 基于标志触发的东西(我承认,这有点混乱,但与 Shiny 一起工作,因为它不没有像 JS 这样合适的回调框架。)