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