【发布时间】:2018-11-16 05:13:00
【问题描述】:
我注意到在R 中,数字的字符向量等价于它们对应的数字向量。
"1234" == 1234
# [1] TRUE
c("1", "2", "3") == 1:3
# [1] TRUE TRUE TRUE
all(c("1", "2", "3") == 1:3)
# [1] TRUE
使用all.equal() 时,我们会收到一条消息,指出模式不同。
all.equal(c("1", "2"), c(1, 2))
# [1] "Modes: character, numeric" "target is character, current is numeric"
使用列表时这会变得更加复杂。
myList <- list("1"="a", "2"=c("b", "c"))
myList[c("2", "1")]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[2:1]
# $`2`
# [1] "b" "c"
#
# $`1`
# [1] "a"
myList[[2]]
# [1] "b" "c"
此时,人们可能会推断出在访问列表时可以互换使用数字和字符向量。但是后来……
myList2 <- list("1"="a", "23"=c("b", "c"))
myList2[c(23, 1)]
# $<NA>
# NULL
#
# $`1`
# [1] "a"
myList2[[23]]
# Error in myList2[[23]] : subscript out of bounds
myList2[["23"]]
# [1] "b" "c"
这种行为的解释是什么?
R 版本 3.5.0
【问题讨论】:
-
如果同时使用字符和数字,一切都会被强制转换为字符。你必须比较
typeof("1") == typeof(1),不是吗。
标签: r list types type-equivalence