问题标签 [r-s3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
471 浏览

r - S3 类的这些方括号是什么?

我从git 上的一个开源存储库中获得了这个。这显示了 S3 类的泛型和方法的编写。但我不理解分配函数的符号或约定。以下是我的问题:

  • 使用反引号``来定义函数名。通常我们不会使用反引号甚至双引号来分配变量/函数,但我看到这种情况发生了很多次。这是命名约定吗?
  • 为什么.包含在 blob 名称之前?通常它不会被称为 blob 而一个方法是 method.blob 吗?
  • 为什么那里有[括号?特别是,[<-[[<-。我们是否在执行某种双重分配?

希望有人能够阐明什么是哈

0 投票
2 回答
295 浏览

r - 卡在自动绘图的 S3 方法的定义中

我坚持为autoplot.

我有以下(完整的代码在这里):

据我所知,我应该能够运行,但它失败了:

为什么找不到功能?我有一个适当的@importFrom ggplot2 autoplotRoxygen 产生正确NAMESPACE的 .

里面有一个ggplot2ImportsDESCRIPTION

我不知道为什么它不起作用以及为什么我需要library(ggplot2)使用它。

0 投票
0 回答
74 浏览

r - 未在包中导入的类的 S3 方法

我们在 R 包中为不同的类提供了多种方法,但它们都与我们在描述中导入的包相距甚远。

现在,我们想为到目前为止不依赖于我们包的类编写更多方法。这很好用,如果必要的包在命名空间中,因此类是 R 已知的。然后,我们不需要在我们的包中导入包。

但是,这样做感觉有点不对劲。这种情况有最佳实践吗?不导入它的优点是依赖项更少,缺点是用户必须主动加载带有他想要使用我们功能的类的包。

更新

@RolandEnhances实际上读起来就像我们追求的东西 - 尽管到目前为止我从未在任何包装中看到它。但是,我们并没有真正访问对象......as包中有一个修改为强制,但它是通过方法导出的,所以我们需要导入方法。

我们唯一要做的是:

0 投票
2 回答
285 浏览

r - 为新类定义 S3“数学”组泛型时出现意外的 log2 错误

我正在尝试将 S3“数学”组泛型用于自定义类。但是我得到了一个奇怪的结果:log()同时工作log2log10产生错误。下面是一个最小的例子:

现在尝试调用log

以 2 为基数:

以上所有工作。但现在log2包装:

也许有人可以帮助我弄清楚这里发生了什么?log2 实际上是否经历了 2 次通用数学定义并失败了?

0 投票
0 回答
557 浏览

r - 通过引用将类添加到 data.frame 列

我想为data.frame(等)创建一个子类。我想要一个创建类信息的函数和另一个删除它的函数。

我认为这将是“R 认可”的添加类的方式。添加然后删除该类按预期工作,返回未触及的对象。

但是,如果我想通过引用更改对象,则此方法不起作用,因为class<-似乎复制了 data.table:

文档说通过引用设置属性的data.table正确方法是使用setattr,并且确实,此功能确实按预期工作

但问题是,当使用相同的逻辑来删除类时,对象并没有完全回到以前的状态

该问题并非特定于data.table::setattr(),因为常规 attr<-函数在更改class属性时具有相同的问题

我的猜测是,它的作用与and class<-不同。但后来我意识到,这似乎只有在我更改列的类时才会发生。更改整个对象的类按预期工作。attr<-setattr()

这不是一个大问题,但它确实让正确测试变得很痛苦,因为我不能testthat::expect_equal()用于单元测试。

那么,data.frame通过引用更改列的类的正确方法是什么?由reprex 包(v0.2.0)于 2018-08-29 创建。

0 投票
2 回答
116 浏览

r - 如何在 R 中的 S3 对象上定义应用程序方法?(就像 C++ 中的“函数对象”)

我在这里试图解决的问题是需要应用(执行)一个 S3 对象,该对象本质上是一个类似向量的结构。这可能包含在某个阶段我需要评估单个参数的各种公式,以便返回原始形状的类似矢量的对象,其中包含在给定参数处对其组成公式的评估。

这方面的例子(只是为了说明)可能是一个变换矩阵 - 比如说旋转 - 对于给定的旋转,它将采用旋转的角度,并产生一个值矩阵,该矩阵乘以一个点。另一个例子可能是经典力学问题中的状态向量。然后给定tva等,它可以返回s ...

现在,我已经在 S3 中创建了我的容器对象,并且它在大多数方面都可以正常工作,使用通用方法;我还发现 Ops.myClass 运算符重载系统非常有用。

为了完成我的课程,我现在需要的只是一种将其指定为可执行文件的方法。我看到有各种机制可以部分完成我想要做的事情,例如我想这as.function()会将对象转换为我想要的行为,并且类似的东西lapply()可以用于将参数“反向”应用于函数。我不知道该怎么做是将它们全部链接起来,以便我可以做这样的模型:

(是的,我已经指定了一个通用的print()例程,让它看起来不错)

欢迎所有建议、示例代码、示例链接。

PS =====

我根据要求添加了一些基本的示例代码。我不确定多少会太多,所以完整的工作最小示例,包括运算符重载在此要点中。

我只在下面显示构造函数和辅助函数:

上述代码的行为如下:

我需要的是它能够做到这一点:

0 投票
1 回答
193 浏览

r - 如何将 S4 插槽选择器`@`重载为通用函数

我试图将@R 中的运算符变成 S3 系统的通用函数。

基于编写 R 扩展中的章节:添加新的泛型我尝试像这样实现泛型@

但是,这似乎不起作用,因为它破坏@了 S4 方法。我使用Matrix包作为 S4 实例的示例:

(Matrix::Matrix(1:4, nrow @.default= 2, ncol = 2), Dim) 中的错误:“dgeMatrix”类的这个对象没有名称“name”的插槽

如何实现泛型@以便在 S4 类的情况下正确调度?


编辑

还对为什么它可能不是一个好主意的意见感兴趣?

0 投票
1 回答
962 浏览

r - 如何在 R 中为 S4 对象创建自定义打印方法

我创建了一个自定义类和打印方法:

如果我使用它工作正常print(test)

但是,如果我只是在没有 的情况下运行变量本身print(),它会以不同的方式显示。

当我在不使用的情况下运行自定义打印方法时,我应该怎么做才能使它以相同的方式工作print()

谢谢!

0 投票
1 回答
113 浏览

r - 为泛型类定义 S3 方法

我想创建一个+粘贴character对象的方法。一种可能的方法是使用中缀运算符:

但是,我想知道是否可以用 S3 方法做同样的事情。您可以通过创建一个新类来做到这一点,比如说char,然后执行以下操作:

但是,如果您尝试创建一个+.character方法,它就不起作用:

但是,如果您character手动分配类,它确实有效:

所以我只是想知道我在这里缺少什么,以及是否可以为泛型类实际定义 S3 方法。

编辑:根据@Csd答案,尚不清楚这是由于属性造成的,因为如果您定义自己的函数,例如:

然后它确实有效。

0 投票
2 回答
143 浏览

r - dplyr::do 内部函数的方法调度

我将如何实现内部函数的方法分派dplyr::do

我已经阅读了 GitHub 问题#719#3558#3429,这些问题提供了有关如何为dplyr动词创建方法的有用信息,但没有什么特别适用的信息dplyr::do- 这有点“特殊”,因为调度不仅需要为dplyr:do自己发生,也需要为内部调用的函数发生dplyr::do(或者至少这就是我所追求的)

这是我尝试过的:

预赛

第 1 步:尝试为 dplyr 动词定义方法

第 2 步:尝试为另一个 dplyr 动词定义一个方法来测试更长的管道

第3步:尝试相同的do

虽然这看起来不错,但问题是调用了默认方法而不是自定义方法。foo

reprex 包(v0.2.1)于 2019 年 1 月 8 日创建