我发现R NA对复杂变量的处理不直观:
z <- complex(real = c( 1, 1, NA, NA, NA),
imaginary = c(NA, NA, 1, 1, NA))
print(z)
#> [1] NA NA NA NA NA
Re(z)
#> [1] 1 1 NA NA NA
Im(z)
#> [1] NA NA 1 1 NA
unique(z)
#> [1] NA
Re(unique(z))
#> [1] 1
identical(z[1], z[3])
#> FALSE
Run Code Online (Sandbox Code Playgroud)
所有这些行为都是按照设计的吗?如果没有,哪些是错误?
这是一个稻草人提案.我并不为此疯狂,但它会导致一致的行为:
看起来R开发人员已经在概念上决定,只有一个复杂的NA值,但它有许多不同的表示.这些表示是在NA实部或虚部的二进制表示中的复数.
为了保持在这个"等价表示"世界的一致性,如果z1和z2复杂的两种不同的表述NA,则f(z1)和f(z2)应返回的所有功能等效的结果f.
在这种情况下,上述行为print(z)和 …
我正在编写一个接受可变数量参数的函数.此外,我希望用户能够将这些参数中的一些遗漏.
考虑将...变成参数列表的任务.这是我的第一次尝试:
f <- function(...) list(...)
Run Code Online (Sandbox Code Playgroud)
这失败了:
f(1,,2)
## Error in f(1, , 2) : argument is missing, with no default
Run Code Online (Sandbox Code Playgroud)
我希望结果如此list(1, NULL, 2).(我并不担心区分f(1,,2)从f(1,NULL,2).)
这是我的第二次尝试:
g <- function(...)
{
args <- match.call()
miss <- vapply(args, identical, NA, quote(expr=))
args[miss] <- list(NULL)
args[[1L]] <- quote(list)
eval.parent(args)
}
Run Code Online (Sandbox Code Playgroud)
这工作(有点):
identical(g(1,,2), list(1, NULL, 2))
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
但是,转发点时失败:
gg <- function(...) g(...)
identical(gg(1,,2), list(1,NULL,2))
## [1] FALSE
Run Code Online (Sandbox Code Playgroud)
有没有办法实现相同的结果g,但在某种方式允许转发点而不使用match.call()?
尝试以下方法很有诱惑力:
h …Run Code Online (Sandbox Code Playgroud) r ×2