在(主要)回答这个问题的过程中,我偶然发现了一些我觉得我以前应该已经看过的东西.假设你有一个清单:
l <- list(a = 1:3, b = letters[1:3], c = runif(3))
Run Code Online (Sandbox Code Playgroud)
尝试强制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'
Run Code Online (Sandbox Code Playgroud)
但是,我显然被允许强制列出一个字符,我只是没想到这个结果:
> as.character(l)
[1] "1:3"
[2] "c(\"a\", \"b\", \"c\")"
[3] "c(0.874045701464638, 0.0843329173512757, 0.809434881201014)"
Run Code Online (Sandbox Code Playgroud)
相反,如果我被允许强制列出字符,我会认为我会看到更像这样的行为:
> as.character(unlist(l))
[1] "1" "2" "3" "a" "b"
[6] "c" "0.874045701464638" "0.0843329173512757" "0.809434881201014"
Run Code Online (Sandbox Code Playgroud)
请注意,我如何指定列表元素最初会影响输出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)"
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
as.character疏浚从我的独创列表的信息l,以吐出1:3对比c(1,2,3).as.character()在列表上调用并获得此表单的输出?对于非平凡列表,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)
Run Code Online (Sandbox Code Playgroud)
帮助文件确实说
对于列表,它单独地去除元素,除了它提取长度为一个字符向量的第一个元素.
我之前在试图回答[不在线]的问题时看到了这一点grep.考虑:
> x <- list(letters[1:10],letters[10:19])
> grep("c",x)
[1] 1 2
Run Code Online (Sandbox Code Playgroud)
grep使用as.characteron x,结果是,因为两者都有c(,所以两个组件都匹配.这需要一段时间来弄明白.
关于" 为什么会这样做? ",我猜想R核心的一个成员希望它能够做到这一点.