问题标签 [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 回答
167 浏览

r - 创建一个名为“Median”的 S4 方法

在这里,最佳答案描述了一种在 S3 和 S4 对象上进行方法调度的好方法。但是,这种方式仅在两种方法具有相同签名时才有效。

median有没有办法为不同的签名创建 S4 方法?

例如,以下内容不起作用:

安装库时,错误提示缺少形式参数,x并且na.rm是原始中值函数的参数。

我想避免作者帖子顶部的解决方案。

0 投票
1 回答
544 浏览

r - 为什么 class(data.frame(...)) 不显示列表继承?

人们常说data.frame继承自,考虑到访问 data.frame 列( 、等)list的许多常见范例,这是有道理的。$sapply

Yet"list"不在data.frame对象的类列表中返回的项中:

取消分类 adata.frame表明它是一个列表:

如果没有 data.frame 方法,测试它看起来会优先调用默认方法而不是 list 方法:

那么两个问题:

  1. data.frame从设计的角度来看,没有正式继承的失败list有什么好处吗?
  2. 那些似乎将data.frames 视为列表的函数如何知道将它们视为列表?从外观上看,lapply它似乎很快就进入了 C 内部代码,所以也许就是这样,但我的想法在这里有点震惊。
0 投票
1 回答
137 浏览

r - 引用类的功能接口

我试图弄清楚为引用类(或实际上是 S4/S3 类)提供功能用户界面的概念含义。简而言之,我担心如果我编写如下所示的代码,那么它就相当于编写函数代码。

这是一个简单的线性回归类:

面向对象的界面对用户不是很友好,所以就像在Martin Morgan 的幻灯片中,我会为底层的引用类写一个功能性的用户界面:

现在这个函数式接口在观察上等同于一个纯函数式

我试图弄清楚这是否是因为我的示例在病态上很简单,但我仍然想知道编写引用类然后将它们包装在函数式接口中而不是编写纯函数式代码是否有任何意义。

任何详细的例子都会有很大帮助。

0 投票
1 回答
609 浏览

r - 分配 S3 子集运算符

我正在编写一个库来处理一个名为“Data”的 S3 类,我需要分配子集运算符,[.Data

在相关的 R 文件中,我有:

安装库没有问题,但是在交互式 R 会话中附加它时,[.Data找不到该函数。如果我只是将上述 R 文件中的代码复制并粘贴到终端中,则该函数将被定义并按预期工作。

此外,如果我将资源 R 文件中的函数名称从[.Data更改为标准名称(如fun),则可以在将库附加到 R 会话中时找到该函数。因此,我认为安装库时整理文件没有问题。

我也尝试过使用更明确的assign功能而不是<-没有成功。问题似乎仅限于我对函数的命名,但由于 S3 的限制,我无法在不更改功能的情况下更改函数的名称。

0 投票
1 回答
68 浏览

r - 强制包装附加而不屏蔽警告

有没有办法指定一个库在附加时不应该抛出有关名称冲突和掩码对象的警告?我想一个解决方案将涉及编辑描述或特殊功能之一,.onAttach但我找不到任何解决这个问题的方法。

我问是因为不需要警告。我已经定义了自己的S3类,并且被屏蔽函数仍然被屏蔽函数的默认方法调用:

如果用户在典型的 R 数据结构(例如向量)上使用中值,median我的包中的方法将自动调用被屏蔽的函数,因此用户不需要真正了解屏蔽。

0 投票
4 回答
758 浏览

r - 修改 S3 对象而不返回它?

我是 R 中面向对象编程的新手,并且不知道如何正确编写修改对象的函数。

这个例子有效:

但我认为应该有一种更简洁的方法来做到这一点而不返回整个对象:

在 R 中编写修改函数的正确方法是什么?“<<-”?

更新:感谢大家在 R 中成为 OOP 的 Rosetta Stone。非常有用。我试图解决的问题在流程方面非常复杂,因此参考类的刚性可能会带来结构的帮助。我希望我能接受所有的回答作为答案,而不仅仅是一个。

0 投票
1 回答
47 浏览

r - 使用 OOP 和 S3 方法检测,然后对单个向量或 data.frame 的所有列进行操作

我编写了一个对单个向量进行操作的函数。有时我想整体使用该功能data.frame。我可以通过使用sapply相关变量来实现这一点,但现在我想使用 S3 方法包含和指导函数。

首先,设置:

因此,在单个向量上,该函数起作用:

但是通过整个data.frame不会:

我很清楚问题是什么 -adder检测到我们正在查看一个整体data.frame,使用“multiple”方法,然后调用“single”方法和参数from并且to没有被传递。

我阅读了 Nicolas Christian 的 Hadley Wickham 的OOP Field GuideAdvanced Programming,但对我来说并没有什么用。我欢迎完全不同的方法,只要它使用 S3 方法,因为这个练习的一部分是让我学习如何使用它们。

0 投票
2 回答
285 浏览

r - 如何在 R S3 中调度 cat?

好的,我将其添加到通用猫中:

没有骰子。

0 投票
1 回答
360 浏览

r - 在 S3*data.frame 上调度自定义方法

我想为 data.frame 与新 S3 类的对象相乘定义我自己的行为(方法)。但我不知道如何让方法调度来找到我的方法。有办法吗?

首先,我定义了 S3 对象 'a' (oldClass "A") 和 'df' (oldClass "data.frame"):

然后我使用 trace(Ops.data.frame, edit=TRUE) 在第一行添加 print("Ops.data.frame") 。这样,我知道何时调用 Ops.data.frame。这是一个演示:

我可以为“A”类定义一个 S3 方法。

这被称为a 但不是df:

所以这行不通。

那么使用 S4 方法呢?这需要定义 S4 类“A”,但通常 S4 调度仍会找到具有 oldClass“A”的 S3 对象。

但是,这对 Ops 不起作用。

Martin Morgan ( https://stackoverflow.com/a/12101238/3203184 ) 和 ?Methods 解释了 df 的这种行为,他们说如果直接调用 S3 泛型,则永远找不到 S4 方法;这似乎发生在df 中,因为 a 和 df 都是 S3 对象。

而且打电话也无济于事setOldClass;问题不在于 S3 对象无法被 S4 方法分派识别而是当两个 S3 对象传递给*. 在这些情况下,直接调用 S3 泛型,没有多少 S4 标签会导致 S4 分派。

所以现在我很茫然。我没有办法*为我的 S3 对象找到 S4 方法,也没有办法编写取代 data.frame 方法的 S3 方法。

如果我愿意将标量设为 S4 对象,我可以获得我想要的调度:

但我真的希望将“a”保留为 S3 对象。有没有办法(1)让'a'成为S3和(2)为Ops('A','data.frame')定义我自己的方法?

0 投票
1 回答
246 浏览

r - 一次为环境分配多个值

给定一个环境x,一个方便的简写assign(x, value, envir = e)是写e[[x]] <- value。目前,没有类似的子集运算符用于一次分配多个对象:

我希望使用内置的 S3 功能为[<-. 我注意到的第一个奇怪之处是,尽管模仿了 S3 函数,但两者[[<-都是[<-原始函数:

通常,S3 函数的格式是主体只是对UseMethod. 例如:

除了原始的赋值运算符之外,[[<-对于 class没有 S3 方法environment

[[<-因此,如果原始函数存在这样的默认值,则必须使用默认值进行原始赋值。尽管如此,我还是为[<-.environment

这似乎表现得好像它已针对以下情况正确实施:

但是,它遇到了同样的错误:

有人可以解释和 S3 方法的不一致[<-[[<-以及如何正确实现环境的子集分配吗?