如何解决后续:从同一列表的元素中查找零位置的不匹配
我正在跟进 this answer。我想创建一个 if()
条件来捕获当 list()
的一个元素中的 0 值对于同一 list()
的第二个元素中的相应位置不为 0 时?
例如,在A
列表中,x
的前两个值是0
,而y
的前两个值不是0
。所以,我想把它当作 error
(stop
)。
然而,在B
列表中,x
的前三个值为0
,y
的前三个值为0
。所以,我想把它当作 (warning
)。
问:虽然我预计 D
列表会出错,但我想知道为什么我的 if()
没有捕捉到它,是否有解决方法?
( A = list(x = c(0,2,2),y = c(3,3,1,1)) ) # Expect error
( B = list(x = c(0,1),y = c(0,1)) ) # Expect warning
( C = list(x = c(5,5,5),y=c(1,1)) ) # Expect fine
( D = list(x = c(0,0),y = c(2,0)) ) ## Expect error but my function doesn't catch it!
check <- function(l){
df <- as.data.frame(l)
if(any(df == 0)){
if(any(rowSums(df) == df[,1]) ){
warning("this is a warning")
} else {
stop("this is an error")
}
}
}
check(A) # Works fine
check(B) # Works fine
check(C) # Works fine
check(D) # NOT OK! Doesn't throw any error!
解决方法
我们可能会使用 xor
check <- function(l){
if(any(unlist(l) == 0)){
if(!any(do.call(xor,l)) ){
warning("this is a warning")
} else {
stop("this is an error")
}
}
}
-测试
check(A)
#Error in check(A) : this is an error
check(B)
#Warning message:
#In check(B) : this is a warning
check(C)
check(D)
#Error in check(D) : this is an error
或将 rowSums
更改为
check <- function(l){
df <- as.data.frame(l)
if(any(df == 0)){
if(!any(rowSums(df == 0) == 1) ){
warning("this is a warning")
} else {
stop("this is an error")
}
}
}
check(A)
#Error in check(A) : this is an error
check(B)
#Warning message:
#In check(B) : this is a warning
check(C)
check(D)
#Error in check(D) : this is an error
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。