S3方法:扩展ggplot2`+.gg`函数

2024-02-11

我正在尝试延长ggplot2一个新的类,我们称之为foo对于这个例子。目标是写一个+.foo将用来代替的方法+.gg。但是我遇到了“方法不兼容”的问题

设置

目前我可以写ggplot_add.foo_layer这将使plot进入我的fooclass 然后照常添加相应的层。

这个想法是,一旦绘图对象继承foo它将发送到+.foo当添加下一层时。

我想这样做的原因是因为我想检查结构是否foo对象仍然有效/与传入层兼容。这将使我不必编写方法ggplot_build.

代码定义

library(ggplot2)

`+.foo` <- function(e1, e2){
  cat("Using foo ggplot +") # for Debugging
  NextMethod() #ideally just dispatches to `+.gg`
}

ggplot_add.foo_layer <- function(object, plot, object_name) {
  plot <- as_foo(plot)
  ggplot2:::add_ggplot(plot, object$layer, object_name) 
}

as_foo <- function(x){
  if(!is_foo(x)){
    class(x) <- c("foo", class(x))
  }
  x
}

is_foo <- function(x) inherits(x, "foo")

foo_layer <- function(x) structure(list(layer = x), class = "foo_layer")

错误

p1 <- ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
  geom_point()
class(p1)
#[1] "gg"     "ggplot"
p1 + geom_density(aes(y = after_stat(density)))


p2 <- ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
  foo_layer(geom_point()) 

class(p2)
#[1] "foo"    "gg"     "ggplot"
p2 + geom_density(aes(y = after_stat(density)))
#Error in p2 + geom_density(aes(y = after_stat(density))) : 
#  non-numeric argument to binary operator
#In addition: Warning message:
#Incompatible methods ("+.foo", "+.gg") for "+" 

从上面的代码来看p1 + geom_*执行得很好。然而p2 + geom_*由于上述关于不兼容方法的错误,无法进行。根据我对 S3 方法调度的了解,我不明白为什么这不起作用。有人可以解释一下为什么会这样或者我该如何解决这个问题。

理想情况下我不必编写方法ggplot_build.foo因为我想要其他包裹ggplot_build如果存在则使用(例如gganimate).


您可以做的一件事是覆盖 ggplot2:::+gg 方法以支持 S3 中的双重调度。如果您正在编写一个包,这并不是一个很好的行为,但它可以完成工作。请注意,这种顽皮的行为并没有阻止其他包覆盖 ggplot 的函数(看看你,ggtern)。

library(ggplot2)

`+.gg` <- function(e1, e2) {
  UseMethod("+.gg")
}

`+.gg.default` <- ggplot2:::`+.gg`

`+.gg.foo` <- function(e1, e2) {
  cat("Using foo ggplot +")
  NextMethod()
}

ggplot_add.foo_layer <- function(object, plot, object_name) {
  plot <- as_foo(plot)
  ggplot2:::add_ggplot(plot, object$layer, object_name) 
}

as_foo <- function(x){
  if(!is_foo(x)){
    class(x) <- c("foo", class(x))
  }
  x
}

is_foo <- function(x) inherits(x, "foo")

foo_layer <- function(x) structure(list(layer = x), class = "foo_layer")

p1 <- ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
  geom_point()

p2 <- ggplot(iris, aes(Sepal.Width, Sepal.Length, color = Species)) +
  foo_layer(geom_point()) 


p2 + geom_density(aes(y = after_stat(density)))
#> Using foo ggplot +

Created on 2021-01-20 by the reprex package https://reprex.tidyverse.org (v0.3.0)

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

S3方法:扩展ggplot2`+.gg`函数 的相关文章

  • 返回数据帧 R 中的下一行

    我有一个看起来像这样的数据框 kind datetime book 2016 04 23 04 23 00 pen 2016 04 23 04 30 00 toy 2016 04 23 06 45 00 我想为数据集中的每一行返回下一行的日
  • 如何对同一列上的数据帧列表中的所有数据帧进行排序?

    我有一个数据框列表dataframes list 举个例子 我把dput dataframes list 在底部 我想对列列表中的所有数据框进行排序enrichment 我可以对一个数据框进行排序 first dataframe lt da
  • 计算例如具有多列 data.frames 的列表中的平均值

    我有几个 data frames 的列表 每个 data frame 有几列 通过使用mean mylist first dataframe a我可以得到这个 data frame 中 a 的平均值 但是我不知道如何计算列表中存储的所有 d
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • 使用 broom 和 tidyverse 总结 r 平方游戏

    我发布了一个问题here https stackoverflow com questions 48627287 getting adjusted r squared value for each line in a geom smooth
  • R中的一元加/减是什么?

    来自 R 的详细信息部分Syntax http stat ethz ch R manual R patched library base html Syntax html帮助页面 定义了以下一元和二元运算符 他们被列出 在优先级组中 从最高
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 使用 purrr 迭代替换数据帧列中的字符串

    我想用purrr使用以下命令在数据框列上迭代运行多个字符串替换gsub 功能 这是示例数据框 df lt data frame Year 2019 Text c rep a aa 5 rep a bb 3 rep a cc 2 gt df
  • 使用 pracma::findpeaks 识别持续峰值

    我的语法有问题peakpat内的选项findpeaks内的函数pramcaR 包 v 2 1 1 我使用的是 R 3 4 3 x64 Windows 我希望该函数能够识别可能有两个重复值的峰值 并且我相信该选项peakpat这就是我能做到的
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • Dendextend:关于如何根据定义的组为树状图的标签着色

    我正在尝试使用一个名为 dendextend 的很棒的 R 包来绘制树状图并根据一组先前定义的组为其分支和标签着色 我已阅读您在 Stack Overflow 中的答案以及 dendextend vignette 的常见问题解答 但我仍然不
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • Python 分析:“‘select.poll’对象的‘poll’方法”是什么?

    我已经使用 python 分析了我的 python 代码cProfile模块并得到以下结果 ncalls tottime percall cumtime percall filename lineno function 13937860 9

随机推荐

  • contenteditable="true" div 字符限制 [重复]

    这个问题在这里已经有答案了 您好 我正在尝试限制 contenteditable true div 中的文本 var char 500 counter append You have strong char strong chars lef
  • 具有多列的 WinForms 组合框(C#)?

    我当前正在使用以下代码来填充组合框 combobox DataSource datatable combobox DisplayMember Auftragsnummer combobox ValueMember ID 有没有办法显示多列
  • 恢复远程分支上的提交

    我曾在本地分支工作过 添加了许多提交 然后我把它推到了remote staging分支 现在我必须撤消已经推送到的最后一次提交remote staging这是我的本地分支的合并remote staging 查看其他答案时我了解到的是 我必须
  • VBA 中的舍入日期和时间

    如何使用 VBA 在 Excel 中四舍五入日期和时间 例如 用户从复制到单元格 A6 的日历中选择值 08 25 2016 09 02 00 我以 15 分钟为间隔提取数据 所以我希望它是 A6 08 25 2016 09 00 00 因
  • Azure DevOps 中的构建管道和发布管道有什么区别?

    我已经设置了几个多阶段构建管道Azure DevOps通过使用 yaml文件 我读过有关可用的 发布管道 的信息 我想知道它们有什么好处 他们似乎也在做同样的事情 甚至不提供 YAML 的支持 那么这里的主要区别是什么 使用发布管道而不是通
  • 记录 C 中“.h”文件使用模式的良好参考资料是什么? [复制]

    这个问题在这里已经有答案了 C 接口和实现 展示了一些有趣的数据结构使用模式 但我确信还有其他模式 http www amazon com Interfaces Implementations Techniques Addison Wesl
  • 是否可以将 ID 集合作为 ADO.NET SQL 参数发送?

    例如 我可以写这样的代码吗 public void InactiveCustomers IEnumerable
  • 如何在 Mac OS 中按“alt+a”/“option+a”键绑定(“⌥+a”)时禁用生成特殊字符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图禁用我的 Mac 中的一种行为 当我在任何文本编辑器中输入组合键时alt option 任何字母 输出将是特殊字符 例如 组合alt
  • 如何将 Ruby 函数放入 SQLite3 查询中?

    我有一个函数需要放入 SQLite3 查询中 我有以下方法 def levenshtein a b case when a empty then b length when b empty then a length else a 0 b
  • 使用 Webpack 2 和 extract-text-webpack-plugin

    我将 extract text webpack plugin 2 0 0 rc 3 与 Webpack 2 2 1 一起使用 并且在运行构建时收到此错误 node modules extract text webpack plugin in
  • 谁拥有 .NET 中的包装流(例如 TextWriter)?

    我最近遇到错误 ObjectDisposeException 无法访问关闭的流 ObjectDisposedException Cannot access a closed Stream System IO MemoryStream Wri
  • python selenium webdriver safari 驱动程序

    快速提问 我一直在构建一个 python selenium 框架来测试我们的网站 我已经成功实现了 Firefox Chrome 和 IE 浏览器测试 但一直在寻找Safari驱动程序 我知道在官方文档中它简要描述了它的不兼容性并且不支持
  • Psycopg2 中的“类型错误:参数 2 必须是连接、游标或无”

    我设置了一个 Heroku 管道 并且刚刚为其启用了评论应用程序 它使用与我的登台和生产应用程序相同的代码库 相同的设置文件和所有内容 当审核应用程序启动时 它可以连接到创建的数据库并运行迁移 当我尝试连接到浏览器中的应用程序时 我得到 T
  • 服务器客户端通信Python

    Server import socket import sys s socket socket socket AF INET socket SOCK STREAM host VAC01 VACLab com port int 2000 s
  • request-promise-native 的替代方案[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找在 Node js 中实现基本 HTTP 方法 例如 GET POST 的现代模块 我想最受
  • 片段中的 EditText 和软键盘问题

    我目前正在构建一个 Android 应用程序 使用户能够拍照并写入其详细信息 该应用程序使用 Sherlock 库 我实现了一个 SherlockFragment 来显示图像 以及一些 EditText 和 TextView 来使用户能够键
  • 使用正则表达式匹配数字 - 仅数字和逗号

    我无法弄清楚如何为示例值构建正则表达式 123 456 789 12 34 1234 8 你可以帮帮我吗 什么是数字 我有一个简单的问题your 简单 问题 一个数字 到底是什么意思 Is 0一个号码 你对这个怎么看 1 Is or 一个号
  • 如何通过 ID 从另一个网站获取元素 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想通过其 ID 从另一个站点获取 div 的内容 比方说 我有一个网站 我想从这个 URL 获取 id 为 mainbar 的 di
  • 如何用C语言生成GUID?

    我想生成插入 SQLite 数据库的 guid 即数据库本身不支持 但是 我想控制某些属性 用于生成不断增加的指导值的有序性 计算机独立性 数据库是公共的 可能 可能不希望 guid 允许某人将数据追溯到特定机器 足够 的随机性 guid
  • S3方法:扩展ggplot2`+.gg`函数

    我正在尝试延长ggplot2一个新的类 我们称之为foo对于这个例子 目标是写一个 foo将用来代替的方法 gg 但是我遇到了 方法不兼容 的问题 设置 目前我可以写ggplot add foo layer这将使plot进入我的foocla