如何测试R对象是否是命名数字向量?

时间:2015-12-22 21:22:20

标签: r validation

我想知道是否有一种简单而强大的方法来测试一个对象是否是一个名为numeric的向量。这是一个例子:

data <- c(2.3, 3.5, 5.7)
typeof(data)
#[1] "double"
mode(data)
#[1] "numeric"
str(data)
# num [1:3] 2.3 3.5 5.7
is.vector(data)
#[1] TRUE
is.numeric(data)
#[1] TRUE

正如您从上面所看到的,我创建了numeric vector。现在我为元素分配名称。

named_vec <- structure(data, names = c('a', 'b', 'c'))
named_vec <- structure(data, names = c('a', 'b', 'c'))
str(named_vec)
# Named num [1:3] 2.3 3.5 5.7
# - attr(*, "names")= chr [1:3] "a" "b" "c"
names(named_vec)
#[1] "a" "b" "c"

我可以使用一些复合条件,例如:

if(is.vector(named_vec) & is.numeric(named_vec) & !is.null(names(named_vec)))           {
   "named_vec is a named numeric vector"
 } else {
   "named_vec is not a named numeric vector"
 }
#[1] "named_vec is a named numeric vector"

或类似的东西,但感觉它可能成为角落案件的牺牲品:

length(names(named_vec)) == length(named_vec)
#[1] TRUE
names(data)
#NULL

我正在寻找简洁而强大的东西。

3 个答案:

答案 0 :(得分:2)

我在你的firt解决方案(if子句)中看到的唯一问题是向量的名称可能不完整,我不知道你的情况是否可以接受。

在第二个解决方案中,非数字命名向量将通过验证,对吗?在我看来,这不是你想要的。

如果您可以提供有关您希望与此验证完全相关的详细信息,我可以为您提供更多帮助。

也更容易

is.vector(f, mode = "numeric")

因此,您可以验证两个条件(矢量和数字)。阅读is.vector帮助。

答案 1 :(得分:1)

我的回答简单地结合了@nicola和@Gregor的评论以及@droubi提供的答案:

创建新功能IsNamedVector。以下是示例:

创建示例数据集

> data <- c(2.3, 3.5, 5.7)
> typeof(data)
[1] "double"
> mode(data)
[1] "numeric"
> str(data)
 num [1:3] 2.3 3.5 5.7
> is.numeric(data)
[1] TRUE
> is.vector(data)
[1] TRUE
> named_vec <- structure(data, names = c('a', 'b', 'c'))
> str(named_vec)
 Named num [1:3] 2.3 3.5 5.7
 - attr(*, "names")= chr [1:3] "a" "b" "c"
> names(named_vec)
[1] "a" "b" "c"

创建自定义函数

> IsNamedVector <- function(VECTOR) {
+   is.vector(VECTOR) & is.numeric(VECTOR) & !is.null(names(VECTOR)) & 
+      !any(is.na(names(VECTOR)))
+ }

测试功能

> length(names(named_vec)) == length(named_vec)
[1] TRUE
> names(data)
NULL
> !all(is.na(names(named_vec)))
[1] TRUE
> missing_names_vec <- structure(data, names = c('a', 'b'))
> str(missing_names_vec)
 Named num [1:3] 2.3 3.5 5.7
 - attr(*, "names")= chr [1:3] "a" "b" NA
> IsNamedVector(named_vec)
[1] TRUE
> IsNamedVector(missing_names_vec)
[1] FALSE

感谢您的帮助。

答案 2 :(得分:0)

对于这种测试,我使用软件包checkmate。它快速且易于使用。

对于命名的数值向量,请检查带有参数{{1}的函数test_numeric()check_numeric()assert_numeric()(有关其他选项,请参见“参数”下的type)部分)。这些函数的输出有所不同,因此您应该确定哪个最适合您。

返回逻辑:

names = "named"

返回字符串:

checkmate::test_numeric(1, names = "named")
#> [1] FALSE
checkmate::test_numeric(c(a = 1), names = "named")
#> [1] TRUE
checkmate::test_numeric(c(a = "A"), names = "named")
#> [1] FALSE

返回错误消息:

checkmate::check_numeric("1", names = "named")
#> [1] "Must be of type 'numeric', not 'character'"
checkmate::check_numeric(1, names = "named")
#> [1] "Vector must be named"