【发布时间】:2020-07-02 21:08:08
【问题描述】:
对 Shiny 来说相对较新,并试图解决我正在制作的使用 .gpx 文件的应用程序的一些问题。目前,在某些时候列表无法绑定在一起。调试它的很大一部分是我无法返回任何数据,即使在导入之后也是如此。文件是列表中列表的非常混乱的混合物等事实无济于事。为了使事情变得更加困难,我无法制作可重现的数据样本,因为 dput(head(df))) 返回所有列表,所以开头看起来像:
list(list(metadata = NULL, bounds = NULL, waypoints = NULL, tracks = list( list(Evening Ride= structure(list(lon = c(-0.12927)
还有一千多行
我已经检查了 dput() 输出并尝试将一个工作样本放在一起,但无法让它像数据一样工作。如果有人有让dput() 处理此类列表数据的功能,请告诉我。但是,str(df[[1]]),返回
List of 5
$ metadata : NULL
$ bounds : NULL
$ waypoints: NULL
$ tracks :List of 1
..$ :List of 1
.. ..$ Evening Ride:'data.frame': 1746 obs. of 4 variables:
.. .. ..$ lon : num [1:1746] -0.129 -0.129 -0.129 -0.129 -0.129 ...
.. .. ..$ lat : num [1:1746] 51.5 51.5 51.5 51.5 51.5 ...
.. .. ..$ ele : chr [1:1746] "25.3" "25.3" "25.2" "25.2" ...
.. .. ..$ time: chr [1:1746] "2019-10-21T17:09:29Z" "2019-10-21T17:09:30Z" "2019-10-21T17:09:33Z" "2019-10-21T17:09:35Z" ...
$ routes : NULL
任何人,希望有人能发现我的代码出错的地方:)
所以,如果我想导入一个文件,我的代码如下所示(并且可行):
library(shiny)
library(tidyverse)
library(plotKML)
# Define UI for data upload app ----
ui <- fluidPage(
# App title ----
titlePanel("Uploading Files"),
# Sidebar layout with input and output definitions ----
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
# Input: Select a file ----
fileInput("file1", "Choose gpx Files",
multiple = TRUE,
accept = c(".gpx")),
# Horizontal line ----
tags$hr(),
# Input: Select number of rows to display ----
radioButtons("disp", "Display",
choices = c(Head = "head",
All = "all"),
selected = "head")
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Data file ----
plotOutput("contents")
)
)
)
# Define server logic to read selected file ----
server <- function(input, output) {
output$contents <- renderPlot({
req(input$file1)
tryCatch(
{
df <-
plotKML::readGPX(input$file1$datapath)
list_row_frame <- data.frame(do.call(rbind, df)) %>%
as_data_frame()
unnested_ride <- list_row_frame %>%
mutate(ride = seq.int(nrow(list_row_frame))) %>%
unnest() %>%
unnest()
}
)
})
}
shinyApp(ui, server)
这可以正常工作。但是,当我想更改代码以输入多个 .gpx 文件时,我遇到了错误'incompatible lengths: x, y'
我将只是服务器功能,因为 UI 是一样的。
server <- function(input, output) {
output$contents <- renderTable({
req(input$file1)
tryCatch(
{
df <-
rbindlist(lapply(input$file1$datapath, plotKML::readGPX),
use.names = TRUE, fill = T)
list_row_frame <- data.frame(do.call(rbind, df)) %>%
as_data_frame()
unnested_ride <- list_row_frame %>%
unnest() %>%
unnest()
return(unnested_ride[[1]])
}
)
})
}
这段代码有时确实很糟糕,但由于永远无法让 return(var) / return(var[[1]]) 返回任何东西,我几乎是盲目地这样做。我试图将 unnest() 更改为 unlist() 但随后我收到有关字符变量的错误。如果有人有任何建议,我将不胜感激。感谢您的帮助。
【问题讨论】:
-
修改您的代码,以便您的函数单独处理每个文件。然后
lapply将该函数添加到输入文件列表。然后将bind_rows从lapply返回的数据帧列表合并为单个数据帧。这紧凑、高效,可让您确定哪些文件有问题。 -
@Limey 感谢您的回答。为什么当前对
lapplyreadGPX的调用不单独处理每个文件?另外,你确定lapply正在返回一个df,在我看来它是一个列表,带有一个$evening_ride 的df?如果它有所不同,我认为任何文件都没有问题,当运行不在 Shiny 中的(略有不同的)脚本时没有问题。