是否可以在字符向量上使用 ensyms?
Is it possible to use ensyms on a character vector?
在下面的示例中,为什么会出现错误或意外
使用 ensyms 接受字符向量参数的结果?
我意识到这个特定的例子很愚蠢:facet_grid()
实际上可以将字符向量作为参数。然而,我想要
了解如何使用 sym、ensym、syms 和 ensyms
信心,更一般地说。
我写了一小段代码,通过字符向量对在 ggplot 中制作的图形进行分面。
library(rlang)
library(ggplot2)
n <- 100
x1 <- rnorm(n)
x2 <- rnorm(n)
c1 <- rbinom(n, 1, .5)
c2 <- rbinom(n, 1, .5)
df_ex <- data.frame(x1=x1, x2=x2, c1=c1, c2=c2)
plot_test <- function(dat, facet_vars){
facet_vars <- ensyms(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
facet_vars <- c("c1", "c2")
#throws error
p <- plot_test(df_ex, c("c1", "c2"))
#seems to look for variable `facet_var`
p <- plot_test(df_ex, facet_vars)
如果将字符向量直接输入到函数中,我会得到错误 "Error: Must supply symbols or strings as argument." 如果我输入 facet_vars,则 ensyms 似乎字面意思是 return "facet_vars" 和分面不执行。有没有一种方法可以在不从省略号中获取参数的情况下使用 ensyms,这是我最熟悉的用法?
如果您想通过非标准评估将符号或字符串传递给您的函数,请使用 ensym
。那不是你用 c("c1", "c2")
做的。这不是 R 中的矢量字面量。在这里,您使用两个参数调用函数 c()
以 return 一个矢量。这不是一个简单的字符串;这是一个函数调用。相反,如果您想将字符串向量转换为符号,只需使用 syms()
。这些将起作用:
plot_test <- function(dat, facet_vars){
facet_vars <- syms(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
facet_vars <- c("c1", "c2")
plot_test(df_ex, c("c1", "c2"))
plot_test(df_ex, facet_vars)
或者,将其捕获为表达式
plot_test <- function(dat, facet_vars){
facet_vars <- enexprs(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
如果您将字符串作为单独的参数传递,ensyms()
效果会更好
plot_test <- function(dat, ...){
facet_vars <- ensyms(...)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
plot_test(df_ex, "c1", "c2")
在下面的示例中,为什么会出现错误或意外 使用 ensyms 接受字符向量参数的结果? 我意识到这个特定的例子很愚蠢:facet_grid() 实际上可以将字符向量作为参数。然而,我想要 了解如何使用 sym、ensym、syms 和 ensyms 信心,更一般地说。
我写了一小段代码,通过字符向量对在 ggplot 中制作的图形进行分面。
library(rlang)
library(ggplot2)
n <- 100
x1 <- rnorm(n)
x2 <- rnorm(n)
c1 <- rbinom(n, 1, .5)
c2 <- rbinom(n, 1, .5)
df_ex <- data.frame(x1=x1, x2=x2, c1=c1, c2=c2)
plot_test <- function(dat, facet_vars){
facet_vars <- ensyms(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
facet_vars <- c("c1", "c2")
#throws error
p <- plot_test(df_ex, c("c1", "c2"))
#seems to look for variable `facet_var`
p <- plot_test(df_ex, facet_vars)
如果将字符向量直接输入到函数中,我会得到错误 "Error: Must supply symbols or strings as argument." 如果我输入 facet_vars,则 ensyms 似乎字面意思是 return "facet_vars" 和分面不执行。有没有一种方法可以在不从省略号中获取参数的情况下使用 ensyms,这是我最熟悉的用法?
如果您想通过非标准评估将符号或字符串传递给您的函数,请使用 ensym
。那不是你用 c("c1", "c2")
做的。这不是 R 中的矢量字面量。在这里,您使用两个参数调用函数 c()
以 return 一个矢量。这不是一个简单的字符串;这是一个函数调用。相反,如果您想将字符串向量转换为符号,只需使用 syms()
。这些将起作用:
plot_test <- function(dat, facet_vars){
facet_vars <- syms(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
facet_vars <- c("c1", "c2")
plot_test(df_ex, c("c1", "c2"))
plot_test(df_ex, facet_vars)
或者,将其捕获为表达式
plot_test <- function(dat, facet_vars){
facet_vars <- enexprs(facet_vars)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
如果您将字符串作为单独的参数传递,ensyms()
效果会更好
plot_test <- function(dat, ...){
facet_vars <- ensyms(...)
p <- ggplot(dat, aes(x1,x2)) + facet_grid(vars(!!!facet_vars))
}
plot_test(df_ex, "c1", "c2")