簡體   English   中英

Shiny,R-錯誤:無法從非數值矩陣得出坐標

[英]Shiny, R - Error: cannot derive coordinates from non-numeric matrix

我試圖使用Shiny包將R繪制成點,因為它們在一整天都出現在不同的點上。

當告知Shiny服務器獲取子集數據幀的坐標(經度和緯度)時,會出現意外問題:

coordinates(selected.tweet.points.spdf) <- ~ lon + lat

有趣的是,這在Shiny之外有效,但在Shiny中不適用於我。

顯示在“閃亮”窗口中的錯誤消息是:

Error: cannot derive coordinates from non-numeric matrix

如果在不告訴空間對象的情況下調用非空間對象的對象上的coordinates()則會出現與錯誤消息相同的錯誤消息,例如:

coordinates(selected.tweet.points.spdf)

這是一個最小可重復的示例(沒有實際繪圖):

library(shiny)
library(tigris)
library(dplyr)
library(leaflet)
library(sp)
library(ggmap)
library(maptools)
library(broom)
library(httr)
library(rgdal)
library(tidyr)

nyc.neighborhoods.url <- GET('http://data.beta.nyc//dataset/0ff93d2d-90ba-457c-9f7e-39e47bf2ac5f/resource/35dd04fb-81b3-479b-a074-a27a37888ce7/download/d085e2f8d0b54d4590b1e7d1f35594c1pediacitiesnycneighborhoods.geojson')
nyc.neighborhoods.spdf <- readOGR(content(nyc.neighborhoods.url, 'text'), 'OGRGeoJSON', verbose = F)
nyc.neighborhoods.df <- tidy(nyc.neighborhoods.spdf)

tweet.points.df <- data.frame(class = c("Not Private", "Not Private", "Private", "Private", "Private", "Private"),
                        lat = c(40.65514, 40.65514, 42.74662, 42.74662, 40.65514, 40.57238),
                        lon = c(-73.94878, -73.94878, -75.77004, -75.77004, -73.94878, -74.15395),
                        time = c("14:00", "14:00", "14:30", "14:30", "14:30", "14:30"))

shinyApp(
  # User interface
  ui = fluidPage(
    titlePanel("Social Media Post Privacy Classifier"),
    sidebarLayout(
      sidebarPanel(
        sliderInput("time", "Time of day (by half hour)",   
                    min = as.POSIXlt("2017-01-01 00:00:00", tz = "GMT"),   
                    max = as.POSIXlt("2017-01-01 23:30:00", tz = "GMT"),   
                    value = as.POSIXct("2017-01-01 00:00:00", tz = "GMT"),   
                    timeFormat="%H:%M", timezone = "+0000", step = 60 * 30, animate = T)
      ),
      mainPanel(
        textOutput("out")
      )
    )
  ),
  # Server
  server = function(input, output) {
    choropleth.selection <- reactive({
      selected.time <- format(input$time, '%H:%M')
      selected.tweet.points.df <- tweet.points.df[tweet.points.df$time == selected.time, ]
      selected.tweet.points.spdf <- selected.tweet.points.df
      coordinates(selected.tweet.points.spdf) <- ~ lon + lat
      proj4string(selected.tweet.points.spdf) <- proj4string(nyc.neighborhoods.spdf)
      selected.tweet.points.df.matches <- over(selected.tweet.points.spdf, nyc.neighborhoods.spdf)
      selected.tweet.points.df <- cbind(selected.tweet.points.df, selected.tweet.points.df.matches)
      selected.tweet.points.df <- selected.tweet.points.df %>% drop_na()
      print(selected.tweet.points.df$class)
    })
    output$out <- renderPrint({ choropleth.selection() })
  }
)

這是一個示例,證明了相同的技術在Shiny之外也適用:

selected.time <- "14:30"
points.df <- data.frame(class = c("Not Private", "Not Private", "Private", "Private", "Private", "Private"),
                        lat = c(40.65514, 40.65514, 42.74662, 42.74662, 40.65514, 40.57238),
                        lon = c(-73.94878, -73.94878, -75.77004, -75.77004, -73.94878, -74.15395),
                        time = c("14:00", "14:00", "14:30", "14:30", "14:30", "14:30"))
points.df <- data.frame(points.df[points.df$time == selected.time, ])
coordinates(points.df) <- ~ lon + lat

selected.tweet.points.spdf為空時,即沒有匹配時間時,將出現錯誤。 在初始運行中就是這種情況,當selected.time00:00 -沒有匹配的tweet.points.df$time

一種可能的解決方案是像這樣更改服務器功能:

server = function(input, output) {
    choropleth.selection <- reactive({
      selected.time <- format(input$time, '%H:%M')
      selected.tweet.points.df <- tweet.points.df[tweet.points.df$time == selected.time, ]
      selected.tweet.points.spdf <- selected.tweet.points.df
      validate(need(nrow(selected.tweet.points.df)>0, "No match")) # <=======
      coordinates(selected.tweet.points.spdf) <- ~ lon + lat
      proj4string(selected.tweet.points.spdf) <- proj4string(nyc.neighborhoods.spdf)
      selected.tweet.points.df.matches <- over(selected.tweet.points.spdf, nyc.neighborhoods.spdf)
      selected.tweet.points.df <- cbind(selected.tweet.points.df, selected.tweet.points.df.matches)
      selected.tweet.points.df <- selected.tweet.points.df %>% drop_na()
      print(selected.tweet.points.df$class)
    })
    output$out <- renderPrint({ choropleth.selection() })
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM