为啥在通过 as.character() 将列表强制为字符时会出现这种行为?
Posted
技术标签:
【中文标题】为啥在通过 as.character() 将列表强制为字符时会出现这种行为?【英文标题】:Why this behavior when coercing a list to character via as.character()?为什么在通过 as.character() 将列表强制为字符时会出现这种行为? 【发布时间】:2011-11-27 08:15:31 【问题描述】:在(主要)回答this 问题的过程中,我偶然发现了一些我觉得我以前应该已经看过的东西。假设您有一个列表:
l <- list(a = 1:3, b = letters[1:3], c = runif(3))
尝试将l
强制转换为各种类型会返回错误:
> as.numeric(l)
Error: (list) object cannot be coerced to type 'double'
> as.logical(l)
Error: (list) object cannot be coerced to type 'logical'
但是,我显然被允许强制列出角色,我只是没想到会出现这样的结果:
> as.character(l)
[1] "1:3"
[2] "c(\"a\", \"b\", \"c\")"
[3] "c(0.874045701464638, 0.0843329173512757, 0.809434881201014)"
相反,如果允许我将列表强制转换为字符,我会认为我会看到更像这样的行为:
> as.character(unlist(l))
[1] "1" "2" "3" "a" "b"
[6] "c" "0.874045701464638" "0.0843329173512757" "0.809434881201014"
请注意,我最初指定列表元素的方式会影响as.character
的输出:
l <- list(a = c(1,2,3), b = letters[1:3], c = runif(3))
> as.character(l)
[1] "c(1, 2, 3)"
[2] "c(\"a\", \"b\", \"c\")"
[3] "c(0.344991483259946, 0.0492411875165999, 0.625746068544686)"
我有两个问题:
as.character
如何从我最初创建的列表l
中挖掘信息,以便吐出1:3
与c(1,2,3)
。
究竟在什么情况下我想这样做?我什么时候想在列表中调用as.character()
并获取此表单的输出?
【问题讨论】:
【参考方案1】:对于非平凡列表,as.character
使用 deparse
生成字符串。
仅当向量为整数且为 1,2,3,...,n - 时才会解析为 1:n
。
c(1,2,3)
是双精度而 1:3
是整数...
不知道 :-)
...但是如果你想在这里了解as.character
,请查看deparse
:
deparse(c(1L, 2L, 3L)) # 1:3
deparse(c(3L, 2L, 1L)) # c(3L, 2L, 1L)
deparse(c(1, 2, 3)) # c(1, 2, 3)
【讨论】:
啊哈,deparse
似乎解释了我的第一个问题。【参考方案2】:
帮助文件确实说
对于列表,它单独解析元素,除了它提取长度为一个字符向量的第一个元素。
我之前在尝试回答有关grep
的问题[非在线] 时看到了这一点。考虑:
> x <- list(letters[1:10],letters[10:19])
> grep("c",x)
[1] 1 2
grep
在x
上使用as.character
,结果是,由于两者都有c(
,所以两个组件匹配。这需要一段时间才能弄清楚。
关于“为什么要这样做?”,我猜是 R 核心的成员之一希望它这样做。
【讨论】:
这就是为什么 R,尽管它非常适合统计编程,但永远不会在那些专门使用它或愿意投入过多精力来处理的狭窄社区之外流行起来的原因之一具有不可预测的行为。以上是关于为啥在通过 as.character() 将列表强制为字符时会出现这种行为?的主要内容,如果未能解决你的问题,请参考以下文章
`levels<-`(`*tmp*`, value = as.character(levels)) 中的错误:因子级别 [3] 重复