如何上传文件并命名 R 中 Shiny 中的列?
How to upload a file and name the columns in Shiny in R?
目标
要在读取数据的 Shiny 应用程序中上传文件,命名变量(列)并在呈现绘图输出之前进行一些数据分析
参考 Shiny App
我正在使用 Shiny gallery 中的这个应用程序作为参考:enter link description here
我尝试过的:
我想在做不同的分析后在许多输出中使用上传的数据。因此,我没有在 renderTable
或 renderPlot
中读取文件,而是在 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 这样合适的回调框架。)
目标
要在读取数据的 Shiny 应用程序中上传文件,命名变量(列)并在呈现绘图输出之前进行一些数据分析
参考 Shiny App
我正在使用 Shiny gallery 中的这个应用程序作为参考:enter link description here
我尝试过的:
我想在做不同的分析后在许多输出中使用上传的数据。因此,我没有在 renderTable
或 renderPlot
中读取文件,而是在 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 这样合适的回调框架。)