如何确定 if 中的错误的原因:需要 TRUE/FALSE 的地方缺少值,这仅在 运行 作为 Shiny App 时发生
How to determine the cause of, Error in if: missing value where TRUE/FALSE needed, that only occurs when running as Shiny App
我正在做一个地图项目,并在传单地图(闪亮的应用程序)中绘制了两个标记数据集。一个数据集比另一个大,我正在绘制连接多对少的大圆弧。一切正常。我将 R 从 3.5 更新到 3.6,现在我得到了 "Error in if: missing value where TRUE/FALSE needed",我已经将它与运行大圆弧的 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 函数以在 shiny 之外工作时,它运行时没有错误。我检查了 NA 或其他异常的数据,我有理由相信没有。
我错过了什么?
我不知道 3.5 和 3.6 之间发生了什么变化,但是,在使用调试工具时,我发现包含 arcbuilder() 调用的 observe({}) 在加载任何数据之前触发了 3 次,这导致 NA 被发送到 gcIntermediate()。
目前的解决方案是将我的 for 循环嵌套到 if 语句中以确保数据已加载:
if (nrow(NetData) != 0) {
for (i in 1:nrow(NetData)) {
很高兴有人能提供更优雅的解决方案,但至少我的代码又能用了。
我正在做一个地图项目,并在传单地图(闪亮的应用程序)中绘制了两个标记数据集。一个数据集比另一个大,我正在绘制连接多对少的大圆弧。一切正常。我将 R 从 3.5 更新到 3.6,现在我得到了 "Error in if: missing value where TRUE/FALSE needed",我已经将它与运行大圆弧的 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 函数以在 shiny 之外工作时,它运行时没有错误。我检查了 NA 或其他异常的数据,我有理由相信没有。
我错过了什么?
我不知道 3.5 和 3.6 之间发生了什么变化,但是,在使用调试工具时,我发现包含 arcbuilder() 调用的 observe({}) 在加载任何数据之前触发了 3 次,这导致 NA 被发送到 gcIntermediate()。
目前的解决方案是将我的 for 循环嵌套到 if 语句中以确保数据已加载:
if (nrow(NetData) != 0) {
for (i in 1:nrow(NetData)) {
很高兴有人能提供更优雅的解决方案,但至少我的代码又能用了。