[英]Create ggplot2 function and specify arguments as variables in data as per ggplot2 standard functionality
我想創建一個繪圖函數,在其中指定數據集,並以與我在ggplot2
中類似的方式將繪圖參數指定為函數參數,即我們在沒有數據集的情況下指定變量名稱,例如hp
而不是mtcars$hp
。
例如:
ggfun <- function(dat, x.var, y.var){
ggp <- ggplot(data = dat,
aes(x = x.var,
y = y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = drat, y.var = hp)
但是它返回:
> ggfun(dat = mtcars, x.var = drat, y.var = hp)
Error in eval(expr, envir, enclos) : object 'drat' not found
In addition: Warning message:
In eval(expr, envir, enclos) : restarting interrupted promise evaluation
我知道使用aes_string
而不是aes
有效,例如:
ggfun <- function(dat, x.var, y.var){
ggp <- ggplot(data = dat,
aes_string(x = x.var,
y = y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
但我寧願避免使用字符串形式。
其他嘗試包括ggfun(dat = mtcars, x.var = mtcars$drat, y.var = mtcars$hp)
,它返回正確的圖形但部分違背了練習的目的,並產生標簽“x.var”和“ y.var" 而不是 "drat" 和 "hp"。
任何已知且相當簡單的解決方法?
使用ggplot2
的開發版本,我們可以傳遞不帶引號的參數,將其轉換為quosure
(使用enquo
)並評估它( !!
)
ggfun <- function(dat, x.var, y.var){
x.var <- enquo(x.var)
y.var <- enquo(y.var)
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = drat, y.var = hp)
對於帶引號的字符串,使用sym
(來自rlang
)將其轉換為符號並進行評估
ggfun <- function(dat, x.var, y.var){
x.var <- rlang::sym(x.var)
y.var <- rlang::sym(y.var)
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
如果我們想傳遞帶引號的或不帶引號的,則將 quosure 更改為字符 ( quo_name
),然后更改為符號 ( sym
) 並評估 ( !!
)
ggfun <- function(dat, x.var, y.var){
x.var <- rlang::sym(quo_name(enquo(x.var)))
y.var <- rlang::sym(quo_name(enquo(y.var)))
ggp <- ggplot(data = dat,
aes(x = !! x.var,
y = !! y.var)) +
geom_point()
return(ggp)
}
p1 <- ggfun(dat = mtcars, x.var = drat, y.var = hp)
p2 <- ggfun(dat = mtcars, x.var = "drat", y.var = "hp")
all.equal(p1, p2)
#[1] TRUE
從rlang
0.4.0 (2019-06-25) 開始,現在有擁抱運算符{{}}
。 使用擁抱運算符:
library(ggplot2)
data("mtcars")
該運算符同時使用函數參數中的列名和標簽。
scatter_plot <- function(data, x, y, title) {
ggplot(data, aes({{x}}, {{y}})) +
geom_point()+
labs(title= {{title}})
}
scatter_plot(mtcars, drat, hp, "Drat by HP")
可以像往常一樣使用+
進一步自定義繪圖。
scatter_plot(mtcars, drat, hp, "Drat by HP with trend") +
geom_smooth()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.