将quosure转换为R中的字符串

时间:2017-10-25 12:21:10

标签: r dplyr rlang

我一直在使用dplyr:

library(dplyr)
library(ggplot2)

thing <- quo(clarity)
diamonds %>% select(!!thing)
print(paste("looking at", thing))
  

[1]“看着〜”“看清晰度”

我真的想打印出放入现状的字符串值,但只能得到以下内容:

print(thing)
  

&lt; quosure:global&gt;

     

〜清晰度

print(thing[2])
  

清晰度()

substr(thing[2],1, nchar(thing[2]))
  

[1]“清晰度”

是否有更简单的方法来“取消引用”quo()?

3 个答案:

答案 0 :(得分:11)

我们可以使用quo_name

print(paste("looking at", quo_name(thing)))

答案 1 :(得分:3)

如果结果太长,

quo_name不起作用:

> q <- quo(a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z)
> quo_name(q)
[1] "+..."

rlang::quo_text(未由dplyr导出)效果更好,但会引入换行符(可以使用参数width控制):

> rlang::quo_text(q)
[1] "a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + \n    q + r + s + t + u + v + w + x + y + z"

否则,也可以使用as.character,但返回长度为2的向量。第二部分是你想要的:

> as.character(q)
[1] "~"                                                                                                    
[2] "a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z"
> as.character(q)[2]
[1] "a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z"

答案 2 :(得分:0)

如果在函数中使用,则需要首先enquo()。还要注意,对于较新版本的rlang,as_name()似乎是首选!

library(rlang)
fo <- function(arg1= name) {
  print(rlang::quo_text(enquo(arg1)))
  print(rlang::as_name(enquo(arg1)))
  print(rlang::quo_name(enquo(arg1)))
}

fo()  
#> [1] "name"
#> [1] "name"
#> [1] "name"