使用“rlang”在“ggplot”中使用“ggrepel”进行条件标记`

使用“rlang”在“ggplot”中使用“ggrepel”进行条件标记`,r,ggplot2,rlang,ggrepel,R,Ggplot2,Rlang,Ggrepel,我正在编写一个自定义函数来创建带有标签的散点图。这里是一个相同的最低版本 #所需的库 图书馆(tidyverse) 图书馆(GG2) 图书馆(ggrepel) #自定义函数 标签加法器5 重量25英里 等等 我可以使用rlang对geom\u label\u repel的代码进行哪些更改,以便对用户提供的任何条件(包括x和/或y)进行评估,并且只有这些标签才会显示在绘图中?您可以尝试类似的方法。在这里,我向函数添加一个表达式参数,检查表达式是否正在使用,然后进行相应的过滤 library(ti

我正在编写一个自定义函数来创建带有标签的散点图。这里是一个相同的最低版本

#所需的库
图书馆(tidyverse)
图书馆(GG2)
图书馆(ggrepel)
#自定义函数
标签加法器5
重量<4英里/加仑<20英里
重量>4英里/加仑>25英里
等等


我可以使用
rlang
geom\u label\u repel
的代码进行哪些更改,以便对用户提供的任何条件(包括
x
和/或
y
)进行评估,并且只有这些标签才会显示在绘图中?

您可以尝试类似的方法。在这里,我向函数添加一个表达式参数,检查表达式是否正在使用,然后进行相应的过滤

library(tidyverse)
library(ggplot2)
library(ggrepel)

# custom function
label_adder <- function(data, x, y, label.var, exp = NULL) {
  param_list <- as.list(match.call())

  if("exp" %in% names(param_list)){
    plot <-
    ggplot(
           mapping = aes(
             x = !!rlang::enquo(x),
             y = !!rlang::enquo(y)
           )) +
    geom_point(data = data) +
    geom_smooth(data = data, method = "lm")+
    geom_label_repel(data = data %>% filter(!!rlang::enquo(exp)), 
                     mapping = aes(label = !!rlang::enquo(label.var)))
    return(plot)
  }
  else{
    plot <-
    ggplot(data = data,
           mapping = aes(
             x = !!rlang::enquo(x),
             y = !!rlang::enquo(y)
           )) +
    geom_point() +
    geom_smooth(method = "lm")+
    geom_label_repel(mapping = aes(label = !!rlang::enquo(label.var)))

  return(plot)
  }
}

# creating dataframe
mtcars_new <- mtcars %>%
  tibble::rownames_to_column(., var = "car") %>%
  tibble::as_data_frame(x = .)

# using the function
label_adder(
  data = mtcars_new,
  x = wt,
  y = mpg,
  label.var = car
)
库(tidyverse)
图书馆(GG2)
图书馆(ggrepel)
#自定义函数

谢谢。我想知道是否有可能避免
if-else
。也就是说,无论
exp
参数是否为
NULL
,函数都将工作。我给出的例子非常简单,所以这看起来没什么大不了的,但我的实际函数很大,包含
if-else
会使它更加复杂。不,我完全理解这一点。我发现这是一个普遍的问题。让我想一想,并想出另一个解决方案。我更新了一个小调整的空间。请注意,如果函数的脚本很长。您可以为大函数的每个部分编写单独的函数,然后让大函数调用单个小函数。我发现这有助于消除冗长函数的混乱为了避免冗长的if-else语句,您需要有一个包含所有数据的默认“过滤器”。行号>0包含所有数据我在此处发布了一个新问题:
label_adder(
  data = mtcars_new,
  x = wt,
  y = mpg,
  label.var = car,
  exp = wt < 4 & mpg < 20
)
label_adder <- function(data, x, y, label.var, exp = NULL) {
  param_list <- as.list(match.call())

  if("exp" %in% names(param_list)){
    my_exp <- rlang::enquo(exp)
  }
  else{
    a <- "row_number() > 0"
    my_exp <- rlang::quo(!! rlang::sym(a))
  }

  plot <-
    ggplot(
           mapping = aes(
             x = !!rlang::enquo(x),
             y = !!rlang::enquo(y)
           )) +
    geom_point(data = data) +
    geom_smooth(data = data, method = "lm")+
    geom_label_repel(data = data %>% filter(!!my_exp), 
                     mapping = aes(label = !!rlang::enquo(label.var)))
  return(plot)

}