我想问这个问题,因为它很难搜索。有没有更有效的方法来编写以下内容:
a <- list(x=FALSE,z=TRUE,l=list()) # a$y is not defined, list contains also lists
f <- function() 1
if(!is.null(a$x)) { if(a$x==TRUE) f() }
if(!is.null(a$y)) { if(a$y==TRUE) f() }
if(!is.null(a$z)) { if(a$z==TRUE) f() }
[1] 1
这个想法是,如果列出任何预先给定的列表元素x
,y
或z
具有值TRUE
函数f()
则被调用,否则不被调用。
目标是只运行一次函数f()
,只将函数调用f()
写入代码一次。函数f()
在其中一个条件x
、y
或z
成立时运行。条件存储在列表a
中,其中还包含其他元素。但是,列表a
可能不包含所有条件,仅包含其中的一部分,这使得缺少的条件为 false。
编辑:
我找到了非常方便的解决方案:
for (b in c("x","y","z")) {
if (!is.null(a[[b]]) & c(a[[b]]),F)[1] == T ) {
print(f())
break
}
}
但为了防止错误:
if(!is.null(a[["y"]]) & a[["y"]] == T) 1
if (!is.null(a[["y"]])& a[["y"]] == T) 1 中的错误: 参数长度为零
我必须制作一个类似聚结的解决方案c(a[["y"]],F)[1]
:
if(!is.null(a[["y"]]) & c(a[["y"]],F)[1] == T) 1
这有效,但看起来不太好,因为我不确定以下条件是否总是有效,即使它在这里有效(?
> c(NULL,1) == c(1)
[1] TRUE
由于在另一个列表中嵌入了一个列表,即嵌套列表,我们宁愿使用rapply
a <- list(x=FALSE,z=TRUE,l=list())
f <- function() 1
rapply(a,function(k)if(!is.null(k)&k==T)f())
z
1
b=list(x=FALSE,Z=TRUE,l=list(x=TRUE,y=TRUE))
rapply(b,function(k)if(!is.null(k)&k==T)f())
Z l.x l.y
1 1 1
使用此类数据:
a <- list(x=FALSE,z=TRUE,l=list()) # a$y is not defined, list contains also lists
f <- function() 1
目的是运行函数f()
如果其中一个条件x
、y
或z
成立。由于@Onyambu的提示,有必要只测试列表中找到的条件,因为未找到的条件是假的。以下是最终解决方案中使用的步骤(最后一个执行行):
> intersect(names(a),c("x","y","z"))
[1] "x" "z"
> a[intersect(names(a),c("x","y","z"))]
$x
[1] FALSE
$z
[1] TRUE
> unlist(a[intersect(names(a),c("x","y","z"))])
x z
FALSE TRUE
> any(unlist(a[intersect(names(a),c("x","y","z"))]))
[1] TRUE
> if (any(unlist(a[intersect(names(a),c("x","y","z"))]))) f()
[1] 1