问题标签 [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.
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()
)。
r - 制作列表的子类
我有以下代码
导致:
什么是不通过子集丢失课程的正确解决方案?例如,class(obj[1:2])
结果mysubclass
并仍然表现为一个列表。
r - 如何不覆盖泛型方法
我试图了解 R 中的 s3 类系统。
文档说我需要为我想要创建的方法创建一个通用函数。
假设我想foo
为 class创建一个方法XYZ
。
有了 R 拥有的所有包,我怎么能确定我没有覆盖以前创建的泛型方法?
摘要是一个不好的例子,因为每个人都可能知道它已经存在,但是我的泛型可能已经定义在我已经加载或我将加载的包中。
r - 参数通过点('...')传递时的部分匹配混乱
我一直在研究一个 R 包,它只是一个图形数据库的 REST API 包装器。我有一个函数createNode
,它返回一个带有类node
和的对象entity
:
我有另一个函数,createRel
它在数据库中的两个节点之间创建关系。规定如下:
允许用户以 key = value的...
形式向关系中添加任意数量的属性。例如,
这会在数据库中创建一个 (Alice)-[KNOWS]->(Bob) 关系,其中包含属性since
及其through
各自的值。from
但是,如果用户使用键或to
在参数中指定属性,R 就会对和...
的类感到困惑。fromNode
toNode
用 key 指定一个属性from
会混淆fromNode
. 它正在使用createRel.default
:
类似地,如果用户使用 key 指定属性to
,则会对 的类产生混淆toNode
,并在 处停止stopifnot()
:
我发现明确设置参数createRel
可以正常工作:
但我想知道我需要如何编辑我的createRel
函数,以便以下语法可以正常工作:
打开这个问题的 GitHub 用户提到它很可能与setAs
on dispatch 冲突,它的参数称为from
and to
。一种解决方案是摆脱...
并更改createRel
为以下内容:
但是,我想看看在进行此更改之前是否还有其他选择。
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 方法的全部要点背道而驰。
有正确的方法吗?
r - 如何在 R 包中重新注册 S3 方法?
我正在为 R 开发一个工具,但我不知道如何替换包内的 S3 方法。让我们举个print.aov
例子。我想替换它的主体,但在stats
命名空间内。如果我只是重新分配命名空间中的函数
调度时将调用先前注册的函数print
,而不是新的。
我也尝试了R.methodsS3包,但它不起作用,因为它试图在锁定的环境中进行分配。
如何确保在 S3 方法分派发生时调用新函数?
r - 在 R6 类上实现 S3 调度的正确方法
我有一个R6
类,我想S3
为它添加一个方法。我发现的文档简要提到了要使用S3
dispatch on R6
you must have class = TRUE
,但我找不到应该如何完成的示例。
我确实从经验上看到,简单地以这种形式编写一个 S3 方法是s3generic.r6class
有效的,但我想知道这是否确实是S3
为R6
.
例如,假设我有一R6
门课可以增强list
问题 1
自然,我想提供一个获取底层列表的方法,所以我想添加一个as.list
方法。在类中添加 S3 泛型和as.list
公共函数是否标准?我直观的答案是两者都加。
所以现在如果我有一个对象mylist <- R6list$new(as.list(letters[1:5]))
,我可以调用as.list(mylist)
或mylist$as.list()
. 其中一个比另一个更受欢迎吗?
问题2为类编写方法
有什么特别之处,或者我上面写的内容是否足够且正确?我不确定该方法是否必须在类定义之外编写,或者是否以某种方式提供了一种在其中编写方法的方法,以便与该类相关的所有代码都本地化。S3
R6
S3
R6
S3
r - R:在全局环境中从包“base”中为“split”创建一个通用函数
为简单起见,我将使用以下示例代码:)
我已经定义了一个 S4 类test
,然后像往常一样,我采用为类setMethod
编写通用函数:split
test
运行上面的代码,R命令行会给出如下信息:
在全局环境中从包“base”中为“split”创建通用函数
然后程序输出如下:
看来输出是正确的。但我的问题是如何抑制消息:
在全局环境中从包“base”中为“split”创建通用函数
非常感谢 :)
PS:
我发现用我们如何实现 S3 泛型方法的形式替换split
S4 类的方法定义,如下所示,可以消除该消息:test
但是,我认为混合 S3 和 S4不是一个好主意 :)
r - 运算符重载在 R 包中停止工作
我有一个容器类,它基本上是一个列表。因为我想支持子集,所以我重载了子集[
运算符(可能实现得很差)。
现在,这在我的开发环境中(当我调试包时)按预期工作。也就是说, ify_old
是一个spectra
对象,而 I do y_new = y_old[-1]
,y_new
仍然是一个spectra
对象。
但是,当我将项目编译为包并安装它时,子集运算符返回 alist
而不是spectra
对象。
有什么线索吗?
编辑
我忘了提到我正在使用 RStudio 和devtools
库。
r - S3 泛型中的变量范围
我有以下片段:
我不明白,为什么可以访问y
in g.numeric <- function(x) y
。据我了解,y 的范围正好在泛型的定义范围内(g <- ...)
。谁能向我解释一下,这怎么可能?