首页 > 解决方案 > 如何检查我是否已通过 NA 而不是数据框?

问题描述

我有一个接受值的例程。这个值必须是数据框或 NA,但用户可以传递几乎任何东西,我想检查一下。

问题是,如果我对传递的值执行 is.na(),我会得到 TRUE 或 FALSE,但如果传递的值是 data.frame,我会得到一个矩阵。我想要一个 TRUE 或 FALSE(在这种情况下为假,因为数据框不是 NA)。我该怎么做?

标签: r

解决方案


@r2evans 的解决方案确实有效,但在您需要单个逻辑值identical()is()可能很有用。

该示例使用identicalandis来测试您的要求,并且应该TRUE 针对单个NA或 adata.frame以及FALSE所有其他输入返回。

# test function where "|" is OK since both return single values
  test <- function(x) is(x, "data.frame") | identical(x, NA))

# test cases
a <- list(
  data.frame(1:3, 4:6), # data.frame
  data.frame(),         # empty data.frame
  NA,                   # single NA
  c(NA, NA, NA),        # vector of NAs
  c(NA, 1.23, NA),      # vector with an NA
  NULL,                 # single NULL
  list(1:3, 4:6),       # list that's almost a data.frame
  1L:3L,                # vector of integers
  LETTERS[1:5])         # vector of characters

# test
  sapply(a, test)
> [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

只有前三个元素返回TRUE


推荐阅读