R 将is.logical应用于具有多个数据类型的列表
我试图找出如何对代码进行数据质量检查 如果我有R 将is.logical应用于具有多个数据类型的列表,r,typechecking,R,Typechecking,我试图找出如何对代码进行数据质量检查 如果我有 x <- list(1,2,T) y <- list(1,2,3) 但是 不会触发错误 我知道我可以用for循环实现,但我希望找到一个更简单的解决方案 用于循环解决方案 for (tmp in x) {if (is.logical(tmp)) stop('Bad data')} 解决方法是使用sapply > any(sapply(x,is.logical)) [1] TRUE > any(sapply(y,is.lo
x <- list(1,2,T)
y <- list(1,2,3)
但是
不会触发错误
我知道我可以用for循环实现,但我希望找到一个更简单的解决方案
用于循环解决方案
for (tmp in x) {if (is.logical(tmp)) stop('Bad data')}
解决方法是使用sapply
> any(sapply(x,is.logical))
[1] TRUE
> any(sapply(y,is.logical))
[1] FALSE
请注意,使用any和sapply要比使用for循环慢得多
> system.time(any(sapply(x,is.logical)))
user system elapsed
1.58 0.02 1.61
> system.time(for (blah in x) {if(is.logical(x)) {}})
user system elapsed
0.29 0.00 0.29
按照下面的建议使用vapply
> system.time(any(vapply(x, is.logical, logical(1))))
user system elapsed
0.30 0.01 0.28
这是一个使用
sapply
对函数进行矢量化的应用程序,请尝试:any(sapply(x,is.logical))
sapply
由于运行simplify2array
而速度较慢。相反,any(vapply(x,is.logical,logical(1L))
的性能与for
循环的性能相同。
> system.time(any(sapply(x,is.logical)))
user system elapsed
1.58 0.02 1.61
> system.time(for (blah in x) {if(is.logical(x)) {}})
user system elapsed
0.29 0.00 0.29
> system.time(any(vapply(x, is.logical, logical(1))))
user system elapsed
0.30 0.01 0.28