我发现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)和unique(z)是正确的.
其他行为应如下:
Re(z)
#> [1] NA NA NA NA NA
Im(z)
#> [1] NA NA NA NA NA
Re(unique(z))
#> [1] NA
identical(z[1], z[3])
#> TRUE
Run Code Online (Sandbox Code Playgroud)
应该看看值的二进制表示,唯一的操作identical与single.NA设置为FALSE:
identical(z[1], z[3], single.NA = FALSE)
#> FALSE
Run Code Online (Sandbox Code Playgroud)