在(主要)回答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()
并获得此表单的输出?答案 0 :(得分:7)
对于非平凡的列表,as.character
使用deparse
生成字符串。
仅当向量为整数且1,2,3,...,n - 时,它才会以1:n
为单位。
c(1,2,3)
是双倍而1:3
是整数...
不知道: - )
...但如果您想了解deparse
,请查看as.character
:
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)
答案 1 :(得分:6)
帮助文件确实说
对于列表,它单独地去除元素,除了它提取长度为一个字符向量的第一个元素。
在尝试回答关于grep
的[不在线]问题之前,我曾见过这个。考虑:
> x <- list(letters[1:10],letters[10:19])
> grep("c",x)
[1] 1 2
grep
在as.character
上使用x
,结果是,由于两者都有c(
,因此两个组件都匹配。这需要一段时间来弄明白。
在“为什么会这样做?”,我猜想R核心的一名成员希望它能够做到这一点。