小编Pat*_*rry的帖子

复杂NA的行为不一致?

我发现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实部或虚部的二进制表示中的复数.

为了保持在这个"等价表示"世界的一致性,如果z1z2复杂的两种不同的表述NA,则f(z1)f(z2)应返回的所有功能等效的结果f.

在这种情况下,上述行为print(z)和 …

r

5
推荐指数
0
解决办法
74
查看次数

解包...缺少参数

我正在编写一个接受可变数量参数的函数.此外,我希望用户能够将这些参数中的一些遗漏.

考虑将...变成参数列表的任务.这是我的第一次尝试:

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

3
推荐指数
1
解决办法
177
查看次数

标签 统计

r ×2