R 将函数参数传递给 ggplot

问题描述 投票:0回答:2

我正在尝试将函数参数(或参数)传递给 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中尝试了

{{}}
[[]]
和其他组合来调用函数参数,但没有成功。

r function ggplot2 eval
2个回答
3
投票

您可以像这样使用 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()
}

来自“Tidy eval helpers”的帮助页面:

(您可以通过以下方式找到它:?enquo):

enquo() 和 enquos() 延迟一个或多个函数参数的执行。前者返回单个表达式,后者返回表达式列表。一旦解除,表达式将不再自行求值。必须使用 u2060!!u2060 (对于单个表达式)和 u2060!!!u2060 (对于表达式列表)将它们注入回求值上下文。


0
投票

如果你不想加载任何额外的包,你可以使用

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

© www.soinside.com 2019 - 2024. All rights reserved.