在R中将引用对象转换为字符串

12

我一直在使用dplyr的quo表达式:

library(dplyr)
library(ggplot2)

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

[1] "观察~" "观察清晰度"

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

print(thing)

<quosure: global>

~clarity

(Note: This is already in Chinese as it was provided in English and translated to Chinese by the user)
print(thing[2])

清晰度()

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

[1] "清晰度"

有没有更简单的方法来"取消引用"一个quo()?

3个回答

28

我们可以使用quo_name

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

9

如果您在函数内使用,需要先使用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"

9

quo_name 如果quosure太长将无法工作:

> 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_textdplyr 没有导出)效果更好,但会引入换行符(可以用参数 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,但会返回长度为两个的向量。第二部分才是您想要的:
> 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接