我正在try 创建一个plot函数,如果.f2 = NULL,它可以为具有因子的列绘制不同 colored颜色 ,如果.f2参数不为NULL,则绘制.f1和.f2列的交互. 当.f2不为NULL时,if语句已经不起作用.之后,我try 创建交互调用,但这不起作用.

我知道我也可以创建一个if语句来创建两个独立的aes函数,但我想知道我是否可以像下面这样做.

input = tibble(x=1:100,y=rnorm(100),f1=factor(rep(c("c",'d'),each=50)),f2=factor(rep(c("a",'b'),50)))

plot_interaction = function(.df, .x, .y, .f1, .f2=NULL) {

  if (!is.null(.f2)) {
     .en1 = .f1 |> enexpr() |> as.character()
     .en2 = .f2 |> enexpr() |> as.character()
     .expr=paste0('interaction(',.en1,',',.en2,')')
     .expr = expr(.expr)
  } else
    .expr = ensym(.f1)
  
  ggplot(.df, aes(x = {{ .x }}, y = {{ .y }}, colour = {{ .expr}})) + 
    geom_point(size = 4, alpha = 0.5)
}

plot_interaction(input, x, y, f1)

plot_interaction(input,x, y, f1, f2)

推荐答案

你应该使用missing而不是is.null来避免你的错误.

然而,如果出现.f2,代码将不会生成交互,因为这样你的条件将输出一个包含符号.exprexpression,而不是包含你希望注入的解析代码的quosure.一个选项是使用rlang::parse_quo而不是expr:

library(tidyverse)

input <- tibble(x = 1:100, y = rnorm(100), 
                f1 = factor(rep(c("c", 'd'), each = 50)),
                f2 = factor(rep(c("a", 'b'), 50)))

plot_interaction <- function(.df, .x, .y, .f1, .f2) {
  
  if(missing(.f2)) {
    .expr <- ensym(.f1) 
  } else {
    .en1 <- .f1 |> enexpr() |> as.character()
    .en2 <- .f2 |> enexpr() |> as.character()
    .expr <- paste0('interaction(', .en1, ',', .en2, ')')
    .expr <- rlang::parse_quo(.expr, env = parent.frame())
  }
  
  ggplot(.df, aes(x = {{ .x }}, y = {{ .y }}, colour = {{ .expr}})) + 
    geom_point(size = 4, alpha = 0.5)
}

这现在允许:

plot_interaction(input, x, y, f1)

plot_interaction(input,x, y, f1, f2)

R相关问答推荐

在数据表中呈现数学符号

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

如何删除R中除某些特定名称外的所有字符串?

查找图下的面积

在R中创建一个包含转换和转换之间的时间的列

如何根据组大小应用条件过滤?

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

用R ggplot2求上、下三角形中两个变量的矩阵热图

R如何计算现有行的总和以添加新的数据行

列名具有特殊字符时的循环回归

R+reprex:在呈现R标记文件时创建可重现的示例

提高圣彼得堡模拟的速度

如何在反曲线图中更改X标签

删除数据帧中特定行号之间的每第三行和第四行

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

如何使用grepl()在数据帧列表中 Select 特定字符串?

使用同一行中的前一个值填充R矩阵中的缺失值

重写时间间隔模糊连接以减少内存消耗