2

我正在做一个地图项目,并在传单地图(闪亮的应用程序)中绘制了两个标记数据集。一个数据集比另一个大,我正在绘制连接多到少的大圆弧。一切正常。我将 R 从 3.5 更新到 3.6,现在我得到“如果错误:缺少 TRUE/FALSE 需要的值”,我已将其隔离到运行大圆弧的 for 语句中。

硬编码到 gcIntermediate() 中的值可以工作,但我只能有 1 个固定弧。使用值创建一个新的数据框是可行的,但是从我导入的数据构建的 data.frame 不再有效。

# inside server.R
output$MapNet <-   renderLeaflet({
    leaflet() %>%
      addTiles(
        urlTemplate = "http://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", 
        attribution = 'Google'
      ) %>%
      setView(lng = -93.85, lat = 37.45, zoom = 5)
  })  


NetData <- data.frame(PRgps.lon = c(-83.35300,-82.52681,-82.31592,-82.91263,-83.61500,-82.73041,-82.73041,-82.73041,-82.73041,-82.73041),
                      PRgps.lat = c(42.97400, 45.46538, 45.45996, 45.40823, 45.25417, 45.51366, 45.51366, 45.51366, 45.51366, 45.51366),
                      JCgps.lon = c(-82.68287,-81.63665,-81.96928,-81.96928,-81.96928,-82.92507,-81.96928,-82.61287,-81.06040,-81.63665),
                      JCgps.lat = c(45.68083, 45.66951, 45.58777, 45.58777, 45.58777, 45.24366, 45.58777, 45.68083, 44.65540, 45.66951),
                      popup = c("A", "P", "M", "M", "J  ", "M", "M", "M", "M", "M")
                      )    

arcbuilder(NetData, MapNet)

# Inside global.R
arcbuilder <- function(NetData, MapNet){
  for (i in 1:nrow(NetData)) {

    arc <- as.data.frame(gcIntermediate(c(NetData[i,]$PRgps.lon, NetData[i,]$PRgps.lat), 
                                        c(NetData[i,]$JCgps.lon, NetData[i,]$JCgps.lat), 
                                        n = 100, addStartEnd = TRUE ))

    MapNet <- MapNet %>% 
      addPolylines(lat = arc$lat,
                   lng = arc$lon,
                   color = "green",
                   weight = 2,
                   popup = NetData[i,]$popup)

  }
}

上面的代码有效,作为 NetData 提供的数据是导入的 NetData 的 head(10)。num 和 chr 方面与单独留在该庄园中时的正确文件相同。当我不硬输入它并将 100 行数据输入 for 循环时,我收到警告:如果错误:需要 TRUE/FALSE 的缺失值。更具体地说,我得到:

Warning: Error in if: missing value where TRUE/FALSE needed
  48: .interm
  47: gcIntermediate
  45: arcbuilder [C:\Users\me\Documents\GitHub\Network_Map/global.R#193]
  44: <observer> [C:\Users\me\Documents\GitHub\Network_Map/server.R#136]
   1: runApp

第 136 行是在 server.R 中调用 arcbuilder() 的地方,第 193 行是在 global.R 中的 arcbuilder() 中使用 gcIntermediate() 的地方

最后,当将整个 ​​NetData data.frame 运行到带有地图设置以在闪亮之外工作的 arcbuilder 函数中时,它运行没有错误。我检查了来自 NA 或其他异常的数据,我有理由相信没有任何数据。

我错过了什么?

4

1 回答 1

0

我不知道 3.5 和 3.6 之间发生了什么变化,但是,在使用调试工具时,我发现包含 arcbuilder() 调用的 observe({}) 在加载任何数据之前触发了 3 次,这导致 NA被发送到 gcIntermediate()。

现在的解决方案是将我的 for 循环嵌套到 if 语句中,以确保数据已加载:

if (nrow(NetData) != 0) {
     for (i in 1:nrow(NetData)) {

很高兴有人提供更优雅的解决方案,但至少我的代码可以再次工作。

于 2019-11-01T18:59:23.093 回答