我正在进行一个地图项目,并在传单地图(闪亮的应用程序(中绘制了两个标记数据集。一个数据集比另一个大,我正在绘制连接多到少的大圆弧。一切都很好。我将R从3.5更新到3.6,现在我得到了"如果出错:需要TRUE/FALSE的地方缺少值",我已经将其隔离到运行大圆弧的for语句中。
将值硬编码到gcIntermediate((中是可行的,但我只能有一个固定的弧。用值创建一个新的数据帧是有效的,但从我导入的数据构建的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的头(10(。num和chr方面与单独留在庄园中的适当文件相同。当我不硬输入它,并将100行的数据输入到for循环中时,我会得到警告:如果出错:缺少需要TRUE/FALSE的值。更具体地说:
Warning: Error in if: missing value where TRUE/FALSE needed
48: .interm
47: gcIntermediate
45: arcbuilder [C:UsersmeDocumentsGitHubNetwork_Map/global.R#193]
44: <observer> [C:UsersmeDocumentsGitHubNetwork_Map/server.R#136]
1: runApp
其中,第136行是服务器中调用arcbuilder((的位置。R和第193行是在global中的arcbuilder((中使用gcIntermediate((的地方。R
最后,当将整个NetData data.frame运行到arcbuilder函数中,并设置映射以在shine之外工作时,它运行时不会出错。我已经检查了NAs或其他异常情况的数据,我有理由相信没有。
我错过了什么?
我不知道3.5和3.6之间发生了什么变化,但在使用调试工具时,我发现包含arcbuilder((调用的observe({}(在加载任何数据之前触发了3次,这导致NA被发送到gcIntermediate((。
目前的解决方案是将我的for循环嵌套到if语句中,以确保数据已加载:
if (nrow(NetData) != 0) {
for (i in 1:nrow(NetData)) {
很高兴有人能提供一个更优雅的解决方案,但至少我的代码能再次工作。