问题标签 [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 投票
2 回答
259 浏览

r - 返回适用于对象的所有 S3 方法的函数

是否有人整理/找到了列出给定对象可用的所有S3方法的好方法?内置函数将为指定的类或指定的泛型函数提供所有可用方法,但不为对象提供。methods()

我想到的例子是一个glm对象,它属于(次要?)类"glm",但也继承自"lm"

“lm”类有 35 种方法,“glm”有 22 种方法。我对结合以下结果的答案感兴趣

以一种明智的方式,以便我可以立即看到(例如)有一个glm特定于 for 的方法add1,但是该方法 for是从类alias继承的。lm

有人有巧妙的方法来做到这一点,还是已经存在?

PS Steve Walker 的S3-S4-reference 类词汇表表明,这对引用类自动起作用,我们必须使用对象来获取方法 ( x$getRefClass()$methods())。

0 投票
1 回答
167 浏览

r - 制作列表的子类

我有以下代码

导致:

什么是不通过子集丢失课程的正确解决方案?例如,class(obj[1:2])结果mysubclass并仍然表现为一个列表。

0 投票
1 回答
625 浏览

r - 如何不覆盖泛型方法

我试图了解 R 中的 s3 类系统。

文档说我需要为我想要创建的方法创建一个通用函数。

假设我想foo为 class创建一个方法XYZ

有了 R 拥有的所有包,我怎么能确定我没有覆盖以前创建的泛型方法?

摘要是一个不好的例子,因为每个人都可能知道它已经存在,但是我的泛型可能已经定义在我已经加载或我将加载的包中。

0 投票
1 回答
287 浏览

r - 参数通过点('...')传递时的部分匹配混乱

我一直在研究一个 R 包,它只是一个图形数据库的 REST API 包装器。我有一个函数createNode,它返回一个带有类node和的对象entity

我有另一个函数,createRel它在数据库中的两个节点之间创建关系。规定如下:

允许用户以 key = value的...形式向关系中添加任意数量的属性。例如,

这会在数据库中创建一个 (Alice)-[KNOWS]->(Bob) 关系,其中包含属性since及其through各自的值。from但是,如果用户使用键或to在参数中指定属性,R 就会对和...的类感到困惑。fromNodetoNode

用 key 指定一个属性from会混淆fromNode. 它正在使用createRel.default

类似地,如果用户使用 key 指定属性to,则会对 的类产生混淆toNode,并在 处停止stopifnot()

我发现明确设置参数createRel可以正常工作:

但我想知道我需要如何编辑我的createRel函数,以便以下语法可以正常工作:

打开这个问题的 GitHub 用户提到它很可能与setAson dispatch 冲突,它的参数称为fromand to。一种解决方案是摆脱...并更改createRel为以下内容:

但是,我想看看在进行此更改之前是否还有其他选择。

0 投票
1 回答
193 浏览

r - R中S3类的方法调度:为多个更高类的特定子类指定方法

我正在研究一组脚本并使用 s3 类和方法来使事情变得更简洁。

班级结构分为三个层次。

  • 级别 1:data.frame
  • 级别 2:sample_report 或 fix_report
  • 第 3 级:stim_report

我想编写一个函数,它只接受 stim_report 类的数据帧,然后根据 stim_report 是从 sample_report 继承还是从 fix_report 继承来调度不同的方法。

显然,我可以做类似的事情

但这违背了方法调度的目的。

请注意,如果数据框的类不是 stim_report,我需要一些东西才能工作,以便函数返回错误。所以我想我也可以这样做:

但同样,这感觉与 S3 方法的全部要点背道而驰。

有正确的方法吗?

0 投票
1 回答
989 浏览

r - 如何在 R 包中重新注册 S3 方法?

我正在为 R 开发一个工具,但我不知道如何替换包内的 S3 方法。让我们举个print.aov例子。我想替换它的主体,但在stats命名空间内。如果我只是重新分配命名空间中的函数

调度时将调用先前注册的函数print,而不是新的。

我也尝试了R.methodsS3包,但它不起作用,因为它试图在锁定的环境中进行分配。

如何确保在 S3 方法分派发生时调用新函数?

0 投票
1 回答
600 浏览

r - 在 R6 类上实现 S3 调度的正确方法

我有一个R6类,我想S3为它添加一个方法。我发现的文档简要提到了要使用S3dispatch on R6you must have class = TRUE,但我找不到应该如何完成的示例。

我确实从经验上看到,简单地以这种形式编写一个 S3 方法是s3generic.r6class有效的,但我想知道这是否确实是S3R6.

例如,假设我有一R6门课可以增强list

问题 1

自然,我想提供一个获取底层列表的方法,所以我想添加一个as.list方法。在类中添加 S3 泛型和as.list公共函数是否标准?我直观的答案是两者都加。

所以现在如果我有一个对象mylist <- R6list$new(as.list(letters[1:5])),我可以调用as.list(mylist)mylist$as.list(). 其中一个比另一个更受欢迎吗?

问题2为类编写方法
有什么特别之处,或者我上面写的内容是否足够且正确?我不确定该方法是否必须在类定义之外编写,或者是否以某种方式提供了一种在其中编写方法的方法,以便与该类相关的所有代码都本地化。S3R6S3R6S3

0 投票
1 回答
511 浏览

r - R:在全局环境中从包“base”中为“split”创建一个通用函数

为简单起见,我将使用以下示例代码:)

我已经定义了一个 S4 类test,然后像往常一样,我采用为类setMethod编写通用函数:splittest

运行上面的代码,R命令行会给出如下信息:

在全局环境中从包“base”中为“split”创建通用函数

然后程序输出如下:

看来输出是正确的。但我的问题是如何抑制消息:

在全局环境中从包“base”中为“split”创建通用函数

非常感谢 :)

PS: 我发现用我们如何实现 S3 泛型方法的形式替换splitS4 类的方法定义,如下所示,可以消除该消息test

但是,我认为混合 S3 和 S4不是一个好主意 :)

0 投票
1 回答
335 浏览

r - 运算符重载在 R 包中停止工作

我有一个容器类,它基本上是一个列表。因为我想支持子集,所以我重载了子集[运算符(可能实现得很差)。

现在,这在我的开发环境中(当我调试包时)按预期工作。也就是说, ify_old是一个spectra对象,而 I do y_new = y_old[-1]y_new仍然是一个spectra对象。

但是,当我将项目编译为包并安装它时,子集运算符返回 alist而不是spectra对象。

有什么线索吗?

编辑

我忘了提到我正在使用 RStudio 和devtools库。

0 投票
1 回答
53 浏览

r - S3 泛型中的变量范围

我有以下片段:

我不明白,为什么可以访问yin g.numeric <- function(x) y。据我了解,y 的范围正好在泛型的定义范围内(g <- ...)。谁能向我解释一下,这怎么可能?