问题
当我使用 dplyr
中的 filter()
或者 select()
对一个列名包含空格的列进行操作时,我的内联代码块会出现错误。通常我会使用反引号来定义这种情况。
示例数据
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(dplyr)
library(knitr)
library(lazyeval)
df <- structure(list(1:3, 2:4), .Names = c("a", "b"), row.names = c(NA, -3L), class = "data.frame")
df <- df %>% select(`a a`=a, `b b`=b)
```
内联代码块
我在尝试类似于`r df %>% filter(`a a` == 1) %>% select(`a a`) %>% as.numeric()`
这样的内容,但是我遇到了以下错误:
Error in base::parse(text = code, keep.source = FALSE) : <text>:2.0: unexpected end of input 1: df %>% filter( ^ Calls: <Anonymous> ... inline_exec -> withVisible -> eval -> parse_only -> <Anonymous>
由于比较明显的原因(反引号结束行内代码块),我可以在intext计算后(我正在将它们格式化为表格)在代码块中重命名列,但是这样做会很令人沮丧。
代价高昂的lazyeval
解决方案
这解决了问题r df %>% filter_(interp(~ which_column == 1, which_column = as.name("a a"))) %>% select_(as.name("a a")) %>% as.numeric()
,但肯定有更好的方法。
df %>% select('a a'=a, 'b b'=b)
对我来说效果一样(至少在控制台上)。我发现唯一需要使用反引号的情况是引用(而不是使用)“SPECIAL”函数,例如%in%
。 - r2evansres = df %>% filter(\
a a` == 1) %>% select(`a a`) %>% as.numeric(),然后将
`r res``插入行内。 - Frank