问题标签 [s4]

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 回答
25754 浏览

class - R类:S3 vs S4

我想在 R 中创建一个类,我应该使用 S3 还是 S4 类?

我读了很多关于他们的不同的东西,有没有一个比另一个更好?

0 投票
2 回答
901 浏览

r - 使用 data() 作为通用 S4 函数

我正在尝试为一个类定义一个新data方法。foo我的foo对象遵循以下结构:

data我试图创建的方法实际上是访问@data插槽的内容:

我一直在查看编写 R 扩展手册的第 7.1 节,但它只处理 S3 类。我也看过这篇文章,但没有成功:

加载包时:

0 投票
1 回答
523 浏览

oop - 有没有办法初始化 S4 对象以便返回另一个对象?

我有一个类层次结构,其超类fb不应该存在任何对象(我尝试了虚拟类,但遇到了无法从虚拟类初始化对象的问题)。此外,我有两个具有相同插槽的子类 ( foo, )。bar现在我想创建一个新对象,对超类使用初始化方法,该方法根据某个值返回子类之一的对象:

显然(并且可能有充分的理由)R 不允许这样做。有没有办法在方法中实现我想要的,而不是在创建新对象时使用 if-else 构造?

0 投票
1 回答
279 浏览

r - 以编程方式区分 R 中的 S3 和 S4 对象

如果给定一个对象x,有没有办法分类它是S3S4(或“其他”)?我看过is.object()and isS4(),并且可以确定某物是一个对象(或不是),它是一个 S4 对象(或不是)。但是,在我看来,S3 对象并不是所有不是 S4 对象的对象的补充。

因此,如何以编程方式完成这些任务?

这是一个让我烦恼的例子,取自以下帮助is.object()

这是否意味着这a是一个S3对象?

0 投票
2 回答
1205 浏览

r - 使用表达式作为参数调度 S4 方法

我试图说服 S4 方法使用表达式作为参数,但总是返回错误。一个简单的例子说明了我在这里尝试做的事情:

如果我现在尝试:

如果我理解正确的话,似乎这些论点已经在泛型中进行了评估。因此,将表达式向下传递给方法似乎至少很棘手。是否有可能使用表达式使用 S4 调度方法?


编辑:更改为转换,因为它是一个更好的例子。

0 投票
1 回答
813 浏览

oop - 在 R 中使用 callNextMethod() 传递参数的问题

我的问题:

为什么callNextMethod()没有按预期将参数传递给下一个方法?

情况:

假设我有两个分层类foobarbar是 的子类foo),我有一个foobar可以为这两个类分派的方法(即,两个类都有方法)。

此外,(子)类的方法在一些计算之后bar调用方法。foocallNextMethod()

两种方法都有相同的附加参数(默认),应该传递给 for 的方法foo,只有它是相关的。

问题描述:
参数没有按预期传递,但默认值取自方法定义。具体来说,在第一个方法中,参数与调用 ( ) 中指定的一样,但是,它在下一个方法中TRUE更改为。FALSE

我希望another.argument将 传递给下一个方法,以便它TRUE也在对该方法的调用中foo


据我所知?callNextMethod,它应该按预期工作(即,命名参数在调用中传递):

对于出现在原始调用中的形式参数,比如 x,在下一个方法调用中存在一个对应的参数,等效于 x = x。实际上,这意味着下一个方法看到相同的实际参数,但参数只计算一次。


我的第二个问题:如何将 another.argument 传递给下一个方法。(我真的很想在这两种方法中保留默认参数)

0 投票
1 回答
3648 浏览

r - 如何在 R 中开发一个包?

我已经编写了一些R使用 S4 类的函数。

现在我想用R这些函数构建一个包。

我应该如何进行?因为我使用了 S4 课程,我应该做些什么不同的事情吗?

0 投票
2 回答
10444 浏览

r - 如何使用 roxygen2 正确记录 S4 方法

我在 SO 和其他地方看到了一些关于在 Roxygen2 的未来版本中应该或将如何完成的讨论。但是,我被困住了。我应该如何使用 Roxygen2 记录 S4 泛型及其方法?全新泛型/方法的工作示例以及扩展基本 S4 泛型的示例将非常有用。我不想为相同泛型的每个 S4 方法制作单独的(大部分)冗余文档。

尽职调查:我找到了“提取”方法的一个有用示例。但是,对于我的问题,它似乎已经过时且不完整。它在类文档中使用 @slot 标记,该标记不再(不再?)支持。它仅显示核心 S4 方法“[”的扩展,而不是包含 S4 泛型文档的完整 Roxygen 示例。

如何使用 roxygen 正确记录 S4“[”和“[<-”方法?

如果我用 title、description 完整记录一个新的 S4 泛型,@param @return @name @aliases @docType @rdname然后只用相应的 记录 S4 方法@name @aliases @docType @rdname,我会收到以下R CMD check警告:

乍一看,好像我用 roxygen2 以这种方式记录的 S4 方法都没有真正起作用。然而,到目前为止,我注意到我对核心方法“show”的扩展没有相关的错误,即使它们的记录方式与其他方法完全相同。这是我在其中一种显示方法上方包含的完整 roxygen 文档的示例,它没有生成缺少文档的错误:

因此,我不知所措。如您所见,我已经包含了R 包手册的 S4 文档部分中描述的 S4 方法的别名约定,即方法应该有一个具有以下名称的别名(不含空格):

不知何故,这并没有被完全理解R CMD check

最后,在使用以下命令构建文档后:

并构建包,我得到了功能文档。特定方法文档中的任何标题都会出现在“描述”字段中,相当尴尬。所以 roxygen2 显然对每个方法的文档做了一些事情,并且走上了正确的轨道。然而,仅仅避免一个大而令人不安的警告是不够的

我查看了 Rd 文件,但我对它们的了解更少,无法快速了解问题所在,而且我无论如何都想知道 roxygen2 解决方案,这样我就不必在每次文档修订后直接操作 Rd 文件。

所以这是一个多部分的问题:

  1. roxygen2 的 S4 通用和 S4 方法文档的当前推荐方法是什么?

  2. 是否有一个很好的例子可以显示完整的细节?

  3. 大多数 S4 方法的文档丢失的警告可能是什么原因和解决方案(即使具有“缺少”文档的方法实际上已经由 roxygen2 解析了它们的文档,并且生成的 Rd 文件至少足以工作在包后R CMD build mypkgname)?

0 投票
3 回答
14061 浏览

class - 如何使用 Roxygen2 正确记录 S4 类插槽?

对于使用 roxygen(2) 记录类,指定标题和描述/细节似乎与函数、方法、数据等相同。但是,插槽和继承是它们自己的一种动物。在 roxygen2 中记录 S4 类的最佳实践是什么(当前的或计划的)?

尽职调查:

我发现@slot在 roxygen 的早期描述中提到了一个标签。 一个 2008 R-forge 邮件列表帖子 似乎表明这已经死了,并且@slot在 roxygen 中不支持:

roxygen2 是这样吗?前面提到的帖子建议用户应该使用 LaTeX 标记制作自己的逐项列表。例如,扩展该类的新 S4 类"character"将被编码和记录如下:

然而,尽管这可行,但这种记录插槽\describe\item方法似乎与 roxygen(2) 的其余部分不一致,因为没有- 分隔的@标签,并且插槽可能会在roxygenize(). 它也没有说明记录正在定义的类的继承的一致方式。@import我想依赖通常仍然可以使用标签正常工作(如果特定插槽需要来自另一个包的非基类) 。

那么,总而言之,roxygen(2) 插槽的当前最佳实践是什么?

目前似乎有三个选项需要考虑:

  • A -- 分项清单(如上例)。
  • B - @slot...但我错过了额外的标签/实现。我无法让@slot 与 roxygen / roxygen2 在上面示例中作为逐项列表的替代品的版本中使用。同样,上面的示例确实适用于 roxygen(2)。
  • C - 一些用于指定插槽的替代标签,例如@param,可以完成同样的事情。

我正在从我在githubroxygen2上的开发页面上发表的帖子中借用/扩展这个问题。

0 投票
2 回答
2617 浏览

r - 如何在R中将插槽的默认值设置为NULL?

我是 R 的新手。

我正在尝试定义一个类似于树节点的类,即它有一个左节点和右节点,它们应该与父节点属于同一类。所以我定义类如下:

我想通过设置原型将 Node 的默认值设置为 NULL,但 R 表示如下:

但是如果我没有将默认值指定为 NULL,那么默认值将是深度为 4 的递归节点,我认为这会浪费资源。

我的考虑是不必要的还是有更好的方法呢?