将is.logical应用于具有多种数据类型的列表

时间:2014-11-24 03:13:44

标签: r typechecking

我正试图弄清楚如何对代码进行一些数据质量检查。

假设我有

x <- list(1,2,T)
y <- list(1,2,3)

我希望能够应用一个将'x'标记为包含错误数据的函数。

if(any(is.logical(x))) stop('Bad data')

但是

if(any(is.logical(y)))

不会触发错误。

我知道我可以用for循环来做,但我希望找到一个更简单的解决方案。

For Loop Solution

for (tmp in x) {if (is.logical(tmp)) stop('Bad data')}

1 个答案:

答案 0 :(得分:2)

解决方案是使用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