【发布时间】:2015-01-25 02:47:42
【问题描述】:
我正在以编程方式获取一堆数据集,其中许多具有以数字开头的愚蠢名称,并且其中包含特殊字符,例如减号。因为没有一个数据集特别大,而且我希望 R 对数据类型做出最好的猜测,所以我正在(ab)使用 dplyr 将这些表转储到 SQLite 中。
我使用方括号来转义可怕的表名,但这似乎不起作用。例如:
data(iris)
foo.db <- src_sqlite("foo.sqlite3", create = TRUE)
copy_to(foo.db, df=iris, name="[14m3-n4m3]")
这会导致错误消息:
Error in sqliteSendQuery(conn, statement, bind.data) : error in statement: no such table: 14m3-n4m3
如果我选择一个合理的名称,这将有效。但是,由于种种原因,我真的很想保留那些繁琐的名字。我也可以直接从 sqlite 创建这样一个名字不好的表:
sqlite> create table [14m3-n4m3](foo,bar,baz);
sqlite> .tables
14m3-n4m3
如果不深入研究,看起来 dplyr 正在以某种我无法理解的方式处理方括号。我怀疑这是一个错误,但我想先检查这里以确保我没有遗漏任何东西。
编辑:我忘了提到我只是将 janky 名称直接传递给 dplyr 的情况。这个错误如下:
library(dplyr)
data(iris)
foo.db <- src_sqlite("foo.sqlite3", create = TRUE)
copy_to(foo.db, df=iris, name="14M3-N4M3")
Error in sqliteSendQuery(conn, statement, bind.data) :
error in statement: unrecognized token: "14M3"
【问题讨论】:
-
这只是一个猜测,但可能是因为 R 的命名约定。我发现的一种可能的解决方法是使用
name=gsub("[.]", "", make.names("[14m3-n4m3]"))。如果您这样做了,您仍然可以在copy_to()中传递您的原始名称,尽管它们在数据中会略有不同。不确定这是否有帮助,但这是我的两分钱。很好的问题。 -
这是一个比我开始实施的更好的解决方法。慢慢地让自己相信好名字 + 其他麻烦 > 坏名字。
-
dplyr 应该为您完成所有转义。如果你这样做
copy_to(foo.db, df=iris, name="14m3-n4m3")会发生什么? -
@hadley - 遗憾的是,这也不起作用。我已经为问题添加了更新;简短版本,我得到:
unrecognized token: "14M3"我已经尝试过当前的 CRAN 版本以及install_github("hadley/dplyr") -
你能提交一个错误吗?这表明我忘记引用某些内容,或者我的引用不正确