将额外参数传递给 ggplot2 geoms:使用省略号 (...)

2023-12-29

这是后续this https://stackoverflow.com/questions/57072096/passing-an-extra-parameter-to-a-custom-geom-in-ggplot2问题。我正在尝试使用自定义参数编写自己的几何图形。我的问题是如何使用省略号(...)来传递额外的参数。

以下示例代码按预期工作:

draw_panel_func <- function(data, panel_params, coord, showpoints=FALSE) {
  print(showpoints)
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  } 
} 


## definition of the new geom. setup_data inserts the parameter 
## into data, therefore making it accessible for .draw_panel_func
GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
  required_aes = c("x", "y"),
  default_aes = aes(shape = 19, colour = "black"),
  draw_key = draw_key_point,
  extra_params = c("na.rm", "showpoints"),
  draw_panel = draw_panel_func
) 

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, showpoints=TRUE, ...) {
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, showpoints=showpoints, ...)
  )   
}

这有效,我可以打电话

ggplot(mpg, aes(displ, hwy)) + geom_simple_point(showpoints=FALSE)

省略点的绘制。

但是,因为我想对不同的新几何对象使用通用函数,所以我更愿意定义draw_panel函数没有显式命名 showpoints 参数,而是使用省略号。我尝试了以下操作(所有其余代码保持不变),它不起作用:

draw_panel_func <- function(data, panel_params, coord, ...) {
  showpoints <- list(...)$showpoints
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

返回的错误是:

if (showpoints) { 中的错误:参数长度为零

当我执行以下操作时,会发生一件有趣的事情:

draw_panel_func <- function(data, panel_params, coord, showpoints=FALSE, ...) {
  #showpoints <- list(...)$showpoints
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

由于某种原因,showpoints 现在始终为 FALSE。但是,那...列表为空。这完全出乎意料。

这一切都非常令人困惑,并且肯定它的表现并不像我预期的那样。在这种情况下可以使用省略号吗?如果是,那么如何?这里发生了什么?

EDIT:按照 Gilean0709 的建议我尝试删除showpoints从定义geom_simple_point:

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, ...) {
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )   
}

这仍然给出相同的错误(showpoints 为 NULL)。


这与参数分配到统计数据、几何图形和位置的方式有关。如果我们看一下代码layer():

function(arguments){
  ...some_body...
  params <- rename_aes(params)
  aes_params <- params[intersect(names(params), geom$aesthetics())]
  geom_params <- params[intersect(names(params), geom$parameters(TRUE))]
  stat_params <- params[intersect(names(params), stat$parameters(TRUE))]
  all <- c(geom$parameters(TRUE), stat$parameters(TRUE), geom$aesthetics())
  extra_param <- setdiff(names(params), all)
  if (check.param && length(extra_param) > 0) {
    warning("Ignoring unknown parameters: ", paste(extra_param, 
      collapse = ", "), call. = FALSE, immediate. = TRUE)
  }
  ...some_more_body...
}

我们可以看到你输入的参数params(包括...)根据参数名称分布在层的不同方面。剩下的任何东西(extra_param)被丢弃并被警告。由于省略号...是一种特殊情况,它本身没有名称(但其中的元素...做),如果 ggplot geoms/stats/aes 不知道中的元素,则会被丢弃....

现在有一个丑陋的方法来解决这个问题,那就是在一开始就复制省略号并将其作为命名参数传递:

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, ...) {
  elli <- list(...)
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, elli = elli, ...)
  )   
}

然后,我们可以让面板绘图函数接受这个省略号的副本作为参数:

draw_panel_func <- function(data, panel_params, coord, elli) {
  if(elli$showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

并相应地更新 ggproto:

GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
                           required_aes = c("x", "y"),
                           default_aes = aes(shape = 19, colour = "black"),
                           draw_key = draw_key_point,
                           extra_params = c("na.rm", "elli"),
                           draw_panel = draw_panel_func
) 

现在,这产生了一个将按预期工作的情节,但它会发出警告,表明它忽略了showpoints参数,因为它被传递给extra_param(尽管从技术上讲它并没有被忽略,因为它现在是elli)。不过,您可能想在面板绘图函数中编写一些额外的检查,以确保showpoints甚至在一开始就提供了一个论点。

希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将额外参数传递给 ggplot2 geoms:使用省略号 (...) 的相关文章

  • 展平 ggplot2 中的 alpha 通道

    ggplot2 的某些对象 函数 支持 alpha 通道 http docs ggplot2 org current geom point html http docs ggplot2 org current geom point html
  • 在 R/ggplot2 中将字符串转换为函数参数的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在开发一个闪亮的应用程序 用户可以选择可以使用 ggplot2 绘制哪些变量 但是我完全不确定将字符串 即要绘制的变量的名称 转换为合适的函数参数的最佳方法 考虑以下非常人为的 有效的示例 df lt dat
  • 替换为 NA

    我有一个包含条目的数据框 看来这些值没有被视为 NA 因为 is na 返回 FALSE 我想将这些值转换为 NA 但找不到方法 Use dfr dfr
  • 删除 R 中的胡须和异常值

    我有连续的数据 我想用它来绘制R s plotly with a box or violin没有异常值和胡须的绘图 set seed 1 df lt data frame group c rep g1 500 rep g2 700 rep
  • 为闪亮的应用程序创建桌面图标

    当我在基本 R 提示中提供以下代码时 我会在浏览器中打开一个闪亮的应用程序 shiny runApp C Myapp 我使用 Windows 7 我试图创建一个桌面图标 以避免我的客户每次想要使用该应用程序时都键入上述代码 我创建了一个桌面
  • 使用 roxygen2 记录数据集

    我正在尝试使用 roxygen2 记录 R 包中的一些数据集 仅考虑其中之一 I have mypkg data CpG human GRCh37 RDa 其中包含一个名为的对象CpG human GRCh37 和一个名为 mypkg R
  • 使用 dplyr 和 ggplot 绘制包括负值的多面水平发散堆积条形图

    我希望这个例子能够让人清楚 我想要堆叠条形 其中中间条形跨越 0 因为它代表中性值 这与李克特量表一起使用 为了重现性 我使用钻石数据集 以下示例与我的用例足够接近 并演示了我很难以正确的顺序获取 好 或 正 数据 因此中性最接近 0 这是
  • R Plotly 禁用图例单击和图例双击

    我想使用 R Plotly 从服务器端禁用绘图图例选择 我们看here https community plot ly t disable legend click functionality hiding traces 1345 2可以使
  • 使用 dplyr 按组计算加权平均值(并复制其他方法)

    我对语法感到困惑dplyr当尝试计算加权平均值时 我听从大卫的建议here https stackoverflow com a 27609266 1457380 语法非常透明 因此很有吸引力 但它似乎没有按我的预期工作 低于加权平均值是针对
  • Sweave 缓存包

    我正在尝试编写一份报告 我的问题是每次我编译 R 时都会加载我在报告中使用的包 如 ggplot2 MASS cubature 这是非常耗时的 有没有办法查包裹 I found 缓存编织但它不起作用 这是我在 sweave 文件中添加的块
  • 插值时间序列

    我有两组具有不同时间戳的数据 一组数据包含校准数据 另一组包含样本数据 校准的频率比样品少得多 我想做的是将校准数据 低频 插值到采样时间序列 高频 上 sam lt textConnection time value 01 00 52 2
  • 如何在 R 中使用 msgbox [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在中显示消息框R 我正在寻找类似的东西msgbox在 VBA 中 因此我可以向用户发出有关问题的警报 此外 我想允许一些用户交互 例如
  • 将英寸高度的字符向量转换为厘米?

    我得到一个字符向量 tibble H c 6 2 5 10 5 5 5 1 5 5 5 4 我想将其转换为厘米 请告知我该怎么做 有几种方法可以使用 1 阅读与fread粘贴到单个字符串后 library data table fread
  • 整理包中的字段说明

    我很抱歉 因为我知道这个答案可能出现在编写 R 包的手册中 但在我阅读和查看其他包的整理字段时 我无法 100 弄清楚该字段的用途 用简单的语言 我的是英语 来看 包的描述文件中的整理字段有什么作用 人们想在那里放什么 我认为这来自于某个时
  • ggplot2:图例中的斜体

    我正在尝试编辑图例中的标签 以便第一个标签 WT 为纯文本 而后续 7 个标签为斜体 我一直在使用element text face c plain rep italic 7 但这导致没有任何标签被转换为斜体 我有点困惑为什么它不起作用 因
  • 在R中提取其他两个字符串之间的字符串

    我试图找到一种简单的方法来提取出现在两个已知子字符串之间的未知子字符串 可以是任何内容 例如 我有一个字符串 a lt anything goes here STR1 GET ME STR2 anything goes here 我需要提取
  • 如何对plot_ly()图表进行分面?

    Using ggplot2 and plotly制作交互式散点图facet wrap library ggplot2 library plotly g lt iris gt ggplot aes x Sepal Length y Sepal
  • 生成与现有变量具有预定义相关性的二进制变量

    对于模拟研究 我想生成一组随机变量 连续变量和二元变量 这些变量与已经存在的变量具有预定义的关联binary变量 此处表示为x 对于这篇文章 假设x是按照下面的代码生成的 但请记住 在现实生活中 x是一个已经存在的变量 set seed 1
  • 如何解决 R 估计中的整数溢出错误

    我正在尝试使用估计模型speedglm在 R 中 数据集很大 约 6988 万行和 38 列 行数和列数相乘得到约 27 亿 超出了整数限制 我无法提供数据 但以下示例重现了该问题 library speedglm large exampl
  • 用于检查和批量线性模型的数据表选项

    我想知道是否有data table用于从数据集中批量处理线性模型并首先进行检查的选项 我需要对每个唯一标识符运行一堆线性模型 但首先我需要进行检查 对于每个唯一的 id 和年份 我需要检查是否有至少 24 个月的先前每月数据 但不超过 60

随机推荐

  • 如何从另一个分支获取更改

    我目前正在研究featurex分支 我们的主分支被命名为our team 自从我开始工作以来featurex 对分支进行了更多更改our team 我在本地完成此操作是为了获取所有最新更改our team git checkout our
  • 将 PEM 证书解析为 JSON

    我有 PEM 证书并且正在使用openssl查看其内容 是否可以将输出解析为 JSON 格式 也许有一个 Java 库或 Bash 脚本可以做到这一点 命令 openssl x509 in sample cer noout text out
  • 无法将函数并行映射到 tarfile 成员

    我有一个包含 bz2 压缩文件的 tar 文件 我想应用该功能clean file到每个 bz2 文件 并整理结果 在系列中 使用循环很容易 import pandas as pd import json import os import
  • Python:将标志传递给函数

    很长一段时间以来 我一直试图找出将标志传递给 python 函数的最佳方法 最直接的方法是这样的 def func data flag1 flag2 flag3 func my data True False True 这确实很好而且简洁
  • Ajax div 刷新后 Jquery Masonry 相互加载

    我正在使用 ajax 刷新包含图像的 div 我最初使用砌体来添加布局 然后ajax调用返回一个js 使用html 方法刷新div 现在完成后我打电话masonry reloadItems 但砌体将所有图像加载到另一图像上 调整页面大小后
  • 如何在android中解析这个JSON数组

    我想要每个标签的名称 电子邮件和图像 我必须在列表元素中显示 response name Brajendra Mishra email email protected cdn cgi l email protection address I
  • 在 Python 中使用互斥锁和并发 future

    我有一些代码使用并发 future 连接到许多远程主机来运行一些命令 例如 def set host to host value connection connect to host info do something with conne
  • 从底部开始将元素附加到 div?

    我有以下代码 button click function parent append div element div parent height 200px width 100px border 1px solid ccc div div
  • MVVM 多视图

    我正在尝试学习 MVVM 到目前为止进展顺利 我偶然发现了一种我不知道如何实现的情况 我想要的 具有左侧导航和右侧详细信息窗格的视图 右侧详细信息将有一个内容容器 其中包含我的用户控件 以便通过左侧窗格选择视图 我拥有的 主视图模型 我数据
  • 是否需要注册兴趣才能写入 NIO 套接字来发送数据?

    是否需要注册兴趣才能写入 NIO 客户端套接字通道来发送数据 我必须总是打电话吗socketChannel register selector SelectionKey OP WRITE 或类似的东西 在写信给客户之前SocketChann
  • 在 Excel 中根据条件查找最大值或最小值

    在我的电子表格中 我有一列包含负值和正值 我需要获得所有正值中的最小值和所有负值中的最大值 我怎样才能这样做呢 使用数组公式 在以下示例中 您要检查的值位于A2 A10 最大负值 MAX IF A2 A10 lt 0 A2 A10 Pres
  • 使用Python将多个制表符分隔的文本文件插入MySQL?

    我正在尝试创建一个程序 它采用多个制表符分层文本文件 并一次处理一个文件 将它们保存的数据输入 MySQL 数据库 有几个文本文件 例如 movie txt 如下所示 1 Avatar 3 Iron Man 3 Star Trek 每个文本
  • Android - 通过网址启动谷歌地图

    在 iPhone 上 maps google com URL 被本机谷歌地图应用程序拦截并加载 我想在 Android 上执行相同的操作 但 Google 地图正在浏览器中加载 那么 在网页中 是否可以有这个url在 Android 中打开
  • 在 Objective C 中谁调用了 dealloc 方法以及何时调用?

    当在 Objective C 中创建自定义类时 何时以及如何创建dealloc方法调用 这是我必须在课堂上实施的事情吗 您永远不会直接发送 dealloc 消息 相反 对象的 dealloc 方法是通过 NSObject 协议的releas
  • WebStorm 终端颜色

    我的创意终端中出现了令人难以忍受的白色背景 网络风暴 有谁知道我该如何改变这个 打开 文件 gt 设置 然后转到 编辑器 部分 gt 颜色和字体 部分 在那里 您将看到 控制台颜色 选项 在这里 您将看到一个交互式编辑屏幕 以确定您希望这些
  • 使用spark窗口函数获取最后一个值

    假设我有一个像这样的数据框 val df sc parallelize Seq 1 0 1 Matt 1 0 2 John 1 0 3 null asInstanceOf String 1 0 2 Adam 1 0 4 Steve toDF
  • 为什么该值没有进入列表?

    在 urichecking2 日志中 我可以看到它是有价值的 但在 uriChecking 中 uriList 为空 为什么 uriList add 不起作用 private fun getPhotoList val fileName in
  • #warning 预处理器指令的可移植性

    我知道 warning 指令不是标准的C C 但有几个编译器支持它 包括 gcc g 但是对于那些不支持它的人来说 他们会默默地忽略它还是会导致编译失败 换句话说 我可以在项目中安全地使用它 而不会破坏不支持它的编译器的构建吗 应该注意的是
  • 方法调用可能会产生 NullPointerException Retrofit Body

    我正在使用 Retrofit 2 从我的 API 获取响应并将其值存储在我的常量中 如下所示 if response isSuccessful constant banner on response body getBanner on co
  • 将额外参数传递给 ggplot2 geoms:使用省略号 (...)

    这是后续this https stackoverflow com questions 57072096 passing an extra parameter to a custom geom in ggplot2问题 我正在尝试使用自定义参