当我运行下面的代码时,我会在下面得到更多错误。
library(ggplot2)
d = data.frame(id=rep(c(1,2),each=3),x=c(1:3,1:3),y=2:7,z=as.numeric(rep(NA,6)))
g = ggplot(d,aes(x,y))
g = g + geom_point() + geom_line()
g = g + geom_vline(aes(xintercept=z))
g = g + facet_wrap(~id)
print(g)
ERROR:
Error in FUN(X[[i]], ...) : subscript out of bounds
In addition: Warning message:
Removed 6 rows containing missing values (geom_vline).
我理解上面的代码有点傻,但它应该有效。在实践中,通常我对z中的某些数字使用数值,而对于其他数字则为NA,但是当我获取数据的子集时,有时我会有所有的NA,这会导致上面的错误。当我使用旧版本的ggplot2时,我没有遇到这个问题。
可以修复吗?
答案 0 :(得分:1)
问题在于您的界限:
g = g + geom_vline(aes(xintercept=z))
因为z在每种情况下都是NA,所以会产生错误。如果至少有一个值是实数,则不会收到此错误。删除它,其余工作正常。
正如您在问题中所说,无论值是否都是NA,您都希望代码始终有效。您可以通过替换:
来实现此目的g = g + geom_vline(aes(xintercept=z))
带有if语句:
if (!all(is.na(z))) g <- g + geom_vline(aes(xintercept=z))
现在,如果您的z列是所有NA,则代码将忽略geom_vline
调用。
z <- c(NA, NA, NA, NA, NA, NA)
d = data.frame(id=rep(c(1,2),each=3),x=c(1:3,1:3),y=2:7,z=as.numeric(z))
g = ggplot(d,aes(x,y))
if (!all(is.na(z))) g <- g + geom_vline(aes(xintercept=z))
g = g + geom_point() + geom_line()
g = g + facet_wrap(~id)
print(g)
答案 1 :(得分:0)
更新到ggplot2 2.1.0(和R 3.2.4)解决了这个问题。