为什么在通过as.character()将列表强制转换为字符时会出现这种情况?

时间:2011-09-29 01:56:40

标签: list r coercion

在(主要)回答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)"

我有两个问题:

  1. as.character如何从我原始创建的列表l中挖掘信息,以便将1:3c(1,2,3)吐出来。
  2. 在什么情况下我想要这样做,确切地说?我什么时候想在列表上调用as.character()并获得此表单的输出?

2 个答案:

答案 0 :(得分:7)

对于非平凡的列表,as.character使用deparse生成字符串。

  1. 仅当向量为整数且1,2,3,...,n - 时,它才会以1:n为单位。

    c(1,2,3)是双倍而1:3是整数...

  2. 不知道: - )

  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

grepas.character上使用x,结果是,由于两者都有c(,因此两个组件都匹配。这需要一段时间来弄明白。

在“为什么会这样做?”,我猜想R核心的一名成员希望它能够做到这一点。