我有一个NA
默认具有的函数,但如果不是,则NA
应该是一个不限于大小1的字符向量。我可以进行检查以验证它们的大小,但是is.na
当向量是length
大于1的字符向量时,会产生标准警告。
so_function <- function(x = NA) {
if (!(is.na(x) | is.character(x))) {
stop("This was just an example for you SO!")
}
}
so_function(c("A", "B"))
#> Warning in if (!(is.na(x) | is.character(x))) {: the condition has length >
#> 1 and only the first element will be used
防止出现我的警告的一个选项是使用identical
:
so_function <- function(x = NA) {
if (!(identical(x, NA) | is.character(x))) {
stop("This was just an example for you SO!")
}
}
在这里,我的问题是,这个函数通常会服用装入R作为输入Excel工作表数据,并NA
从产生的价值往往是NA_character_
,NA_integer_
和NA_real_
,因此identical(x, NA)
往往是FALSE
当我真正需要它TRUE
。
对于更广泛的上下文,我正在为一个程序包创建的S3类遇到此问题,下面的函数近似于如何验证该类的多个属性(即警告出现时)。因此,我试图避免将警告作为解决方案,因此有兴趣了解存在解决此问题的最佳实践。
编辑
为了使用例更清楚,这是在验证类的属性,在此我想确保该属性是单个NA
值或任意长度的字符向量:
so_function(NA_character_) # should pass
so_function(NA_integer_) # should pass
so_function(c(NA, NA)) # should fail
so_function(c("A", "B")) # should pass
so_function(c(1, 2, 3)) # should fail
长度警告来自于的使用if
,期望长度为1的向量,并且is.na
已向量化。
您可以使用any
或all
将is.na
其压缩为长度为1的向量,但在某些极端情况下,它可能无法按预期工作,因此我将使用短路评估来检查它是否为长度1 is.na
:
so_function <- function(x = NA) {
if (!((length(x)==1 && is.na(x)) | is.character(x))) {
stop("This was just an example for you SO!")
}
}
so_function(NA_character_) # should pass
so_function(NA_integer_) # should pass
so_function(c(NA, NA)) # should fail
Error in so_function(c(NA, NA)) : This was just an example for you SO!
so_function(c("A", "B")) # should pass
so_function(c(1, 2, 3)) # should fail
Error in so_function(c(1, 2, 3)) : This was just an example for you SO!
另一种选择是改为使用NULL
默认值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句