我正在尝试重命名链中的几个变量:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"cc..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
这样可以正常工作,但当其中一个变量的名称中有空格时:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"c c..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
我收到此错误:
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
^
自从我直接运行gsub
后,我不确定这源于何处:
setNames(
names(df_foo),
gsub("[[:punct:]]", "", names(df_foo)))
我没有收到错误。不知道这里发生了什么。
此问题现已在dplyr
GH问题页面上提升为issue #2391。
答案 0 :(得分:3)
一般来说:我强烈建议你永远不要在空格中使用变量名。它们很痛苦,经常会造成比它们更值钱的麻烦。
以下是此错误的原因。
rename_
发送给dplyr:::rename_.data.frame
。该功能的第一行是:
dots <- lazyeval::all_dots(.dots, ...)
lazyeval
函数会调用lazyeval::as.lazy_dots
,lazyeval::as.lazy
使用lazyeval:::as.lazy.character
,lazy_(parse(text = x)[[1]], env)
本身使用调用parse()
的{{1}}。现在,help("parse")
期望有效的R表达式作为其文本参数:
文字:字符向量。要解析的文本。元素被视为文件的行。 (来自
rename_
)
这就是为什么parse(text = x)
似乎不喜欢带有空格的字符向量,我们得到了lazyeval:::as.lazy(names(df_foo)[2])
&#34;
<lazy>
expr: b...b
env: <environment: base>
lazyeval:::as.lazy(names(df_foo)[3])
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
^
{{1}}
我不知道某个解决方案,只有使用base才能进行这种简单的重命名。