R textConnection:“参数'对象'必须解析为单个字符串”

时间:2014-01-16 19:05:57

标签: r

我想将字符串列表转换为数据框。 但是,我收到了这个错误:

> read.csv(textConnection(c("id,name,count",
                          '6289,aa,16',
                          '6269,bb,8',
                          '6269,cc,8',
                          '6269,dd,8',
                          '6610,ee,4')))
 Error in textConnection(c("id,name,count", "6289,aa,16", "6269,bb,8",  : 
  argument 'object' must deparse to a single character string
Calls: read.csv -> read.table -> textConnection

当我只删除一行时,它可以工作:

> read.csv(textConnection(c("id,name,count",
                          '6289,aa,16',
                          '6269,bb,8',
                          '6269,cc,8',
                          '6610,ee,4')))
   id name count
1 6289   aa    16
2 6269   bb     8
3 6269   cc     8
4 6610   ee     4

发生了什么事?!

1 个答案:

答案 0 :(得分:2)

Ananda说正确的行为源于deparse。在textConnection()文档的详细信息部分下,它说,

  

object应该是字符向量的名称:但是,如果短表达式被解析为少于60个字节,则它们将被接受。

deparse()将表达式转换为字符串。当表达式脱节超过60个字节时,deparse会尝试将字符串拆分为较短的文本块;即一个字符串向量。试试吧:

deparsed <- deparse(c("this expr","deparses to length=1,","nchar=57 bytes"))
deparsed
[1] "c(\"this expr\", \"deparses to length=1,\", \"nchar=57 bytes\")"
nchar(deparsed)
[1] 57

deparsed <- deparse(c("whereas this longer expression","deparses to length=2,","nchar=c(61,23) bytes"))
deparsed
[1] "c(\"whereas this longer expression\", \"deparses to length=2,\", "
[2] "\"nchar=c(61,23) bytes\")"
nchar(deparsed)
[1] 61 23

这就是你收到错误的原因

argument 'object' must deparse to a single character string

表达较长的表情,但不是较短的表情。

正如sds和Simon所示,解决方案是将表达式分配给对象,然后在对象名称而不是原始表达式上调用textConnection。

txt <- c("id,name,count", '6289,aa,16', '6269,bb,8',
         '6269,cc,8', '6269,dd,8', '6610,ee,4')
read.csv(textConnection(txt))
    id name count
1 6289   aa    16
2 6269   bb     8
3 6269   cc     8
4 6269   dd     8
5 6610   ee     4

在幕后,textConnection现在正在调用deparse(substitute(txt))而不是deparse(substitute(c("id,name,count", ...)))。只有较短的表达式才会删除单个字符串。这就是textConnection所需要的。