我正在尝试将函数参数(或参数)传递给 ggplot - 这是一个要显示/测试的虚拟数据集
test <- data.frame(id=c(1,2,3,4,5),
base=c(230,365,390,201,298),
heig=c(200,310,90,100, 91),
widt=c(21,75,22,46,51))
fun1 <- function(va1,va2){
ggplot(data=test,mapping=aes(va1, va2)) + geom_point()
}
fun1(base,heig)
我收到错误:
Error in `geom_point()`: ! Problem while computing aesthetics. ℹ Error occurred in the 1st layer. Caused by error in `FUN()`: ! object 'base' not found Run `rlang::last_trace()` to see where the error occurred.
我在ggplot中尝试了
{{}}
、[[]]
和其他组合来调用函数参数,但没有成功。
您可以像这样使用 enquo:
library(ggplot2)
library(rlang)
fun1 <- function(va1,va2) {
va1 <- enquo(va1)
va2 <- enquo(va2)
ggplot2::ggplot(data=test,mapping=aes(!!va1, !!va2)) +
geom_point()
}
(您可以通过以下方式找到它:?enquo):
enquo() 和 enquos() 延迟一个或多个函数参数的执行。前者返回单个表达式,后者返回表达式列表。一旦解除,表达式将不再自行求值。必须使用 u2060!!u2060 (对于单个表达式)和 u2060!!!u2060 (对于表达式列表)将它们注入回求值上下文。
如果你不想加载任何额外的包,你可以使用
match.call
和eval
:
library(ggplot2)
test <- data.frame(id=c(1,2,3,4,5),
base=c(230,365,390,201,298),
heig=c(200,310,90,100, 91),
widt=c(21,75,22,46,51))
fun1 <- function(va1,va2){
arg <- match.call()
ggplot(data=test, mapping=aes(eval(arg$va1), eval(arg$va2))) + geom_point()
}
fun1(base, heig)
创建于 2024-02-01,使用 reprex v2.0.2