将quosure转换为R中的字符串
converting a quosure to a string in R
我一直在使用 dplyr 的 quosures:
library(dplyr)
library(ggplot2)
thing <- quo(clarity)
diamonds %>% select(!!thing)
print(paste("looking at", thing))
[1] "looking at ~" "looking at clarity"
很想打印出放入quo的字符串值,但是只能得到如下:
print(thing)
<quosure: global>
~clarity
print(thing[2])
clarity()
substr(thing[2],1, nchar(thing[2]))
[1] "clarity"
是否有更简单的方法来 "unquote" a quo()?
我们可以使用quo_name
print(paste("looking at", quo_name(thing)))
如果 quosure 太长,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
,但是returns一个长度为二的向量。第二部分是你想要的:
> 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"
如果您在函数内使用,您需要先 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"
我一直在使用 dplyr 的 quosures:
library(dplyr)
library(ggplot2)
thing <- quo(clarity)
diamonds %>% select(!!thing)
print(paste("looking at", thing))
[1] "looking at ~" "looking at clarity"
很想打印出放入quo的字符串值,但是只能得到如下:
print(thing)
<quosure: global>
~clarity
print(thing[2])
clarity()
substr(thing[2],1, nchar(thing[2]))
[1] "clarity"
是否有更简单的方法来 "unquote" a quo()?
我们可以使用quo_name
print(paste("looking at", quo_name(thing)))
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
,但是returns一个长度为二的向量。第二部分是你想要的:
> 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"
如果您在函数内使用,您需要先 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"