11

我一直在使用 dplyr 的 quosures:

library(dplyr)
library(ggplot2)

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

[1]《看着~》《看着清明》

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

print(thing)

<quosure:全球>

~清晰

print(thing[2])

明晰()

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

[1] “清晰”

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

4

3 回答 3

27

我们可以用quo_name

print(paste("looking at", quo_name(thing)))
于 2017-10-25T12:22:39.267 回答
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_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"
于 2018-05-08T08:42:25.707 回答
6

如果你在一个函数中使用,你首先需要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"
于 2019-06-19T02:23:44.023 回答