r - 简化测试,其中预设列表元素值之一未丢失且为 TRUE



我想问这个问题,因为它很难搜索。有没有更有效的方法来编写以下内容:

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

这个想法是,如果列出任何预先给定的列表元素xyz具有值TRUE函数f()则被调用,否则不被调用。

目标是只运行一次函数f(),只将函数调用f()写入代码一次。函数f()在其中一个条件xyz成立时运行。条件存储在列表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()如果其中一个条件xyz成立。由于@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

最新更新