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

r - 在 R 包中创建 S3 类

我编写了非常简单地为包创建 S3 类的代码。我寻求创建一个新的 S3 类,以便我可以开发例如自定义print()方法。

我已经在一个简单的 R 脚本中测试了代码,但是一旦将函数包装到一个包中,功能就会中断并且不再创建 S3 类。我无法提供用于创建包的可重现代码,但下面介绍了我想构建到包中的功能的简化版本。

我的代码在原始编写或在函数中编写时都能完美运行。

class(x)将返回c("integer", "newS3class")

同样,现在,声明一个做同样事情的函数。这也很好用。实际上,我的函数foo()首先对输入执行一些操作,然后使用新类返回输出。

class(1:5)返回"integer"class(foo(1:5))返回c("integer", "newS3class")。这正如预期的那样。

但是,当我开发一个包,例如,mypkg然后运行mypkg::foo()时,功能被破坏了。即,(mypkg::foo(1:5))返回“整数”而不是c("integer", "newS3class").

在从其组成功能构建包的过程中,范围界定是否发生了某些事情,这阻止了它的工作?

0 投票
1 回答
78 浏览

r - 包中的递归 S3 调用

我想要完成的

我有一个 R 包,其中包含一些以递归方式使用的内部 R 函数(在下面的示例中称为 f 和 g)。在最小示例中,函数只返回其参数的长度,但在实际代码中,它们会触发更复杂的计算。

我想要做的是以下内容:

  1. 如果用户将对象传递给函数 g,R 应该查找我们是否有可以调用该对象的 S3 方法。

  2. 如果对象是一个列表,函数 g 应该应用于列表中的每个对象。如果我们还没有达到最大递归深度,请转到 1。如果我们达到最大递归级别,请停止。

显示问题的代码

将以下代码放入包中很重要。我得到的错误只有在代码是包的一部分时才能重现。

utils.R

core.R

我的期望

错误

结果应该是 6;

但我收到一条错误消息:

通行证

结果应该是 3。

评论

当我调用该示例时,该示例失败,在将函数 g 加载到全局命名空间后,我得到了预期的结果 6。

所以我认为这是一个与命名空间/S3 相关的问题,但我不知道如何解决它。

0 投票
1 回答
345 浏览

r - 在 R 中使用 S3 构造函数

我今天早些时候正在查看一些代码(https://www.r-bloggers.com/building-your-own-blockchain-in-r/),其中有人以我从未见过的方式定义 S3 函数并且喜欢这种视觉风格,但从未在 R 代码的其他任何地方看到过它,并想弄清楚原因。

他们定义了许多 S3 类,看起来像

基本上,我觉得这个人试图让 R 的通用函数 S3 OO 系统看起来像更标准的消息传递 OO 系统(如 Python、Java 等),其中方法属于类。

我的感觉是,这在 R 中可能是不好的做法,因为

并没有真正做到你认为的那样。诚然,我的理解是,在其他面向对象的语言中,baz$change_foo实际上是绑定到的那个实例my_class,所以它总是编辑baz.

在 R 中,该绑定实际上并没有发生,因此定义inst中的可能会发现与它恰好在环境中不同的情况。my_classinstbaz

只有这个list2env调用才能让这里的事情保持整洁,在一个更复杂的例子中可能会搞砸。

我确实喜欢这段代码在视觉上封装函数的方式my_class,所以我很好奇我是否在这里做一些事情,或者我是否正在全力以赴。Stack Overflow 的居民们,你们怎么说?这是好还是坏的风格?

0 投票
1 回答
297 浏览

r - R的'as'函数的类型/起源

R 的 S3 OO 系统以泛型函数为中心,泛型函数调用方法取决于调用泛型函数的对象的类。关键是通用函数调用适当的方法,而不是在类中定义方法的其他 OO 编程语言。

例如,该mean函数是通用函数。

这将打印

我正在探索 R 并找到了该as功能。我对 R 说函数不是通用的,但它仍然有方法这一事实感到困惑。

最后有一个警告说这as不是通用的。

有人可以解释一下这个as功能是什么以及如何连接as.listas.data.frame吗?R 说这as.list是一个泛型(我很想对 R 中的不一致感到有点生气,因为我希望成为泛型函数的对象as.list的方法)。请帮忙。listas

0 投票
0 回答
230 浏览

r - R CMD 检查不识别 S3 通用方法

我正在编写一个包,如果我在我的 Rstudio 中运行代码,它会运行,但是当我将它交给 R CMD check 运行时,它无法识别 S3 方法。我有一个通用方法:

然后是替代方法:

现在我在文档中运行的一个示例是:

如果我将代码作为普通代码运行,它可以工作,但如果我使用 R CMD check 检查它,它会抱怨:

AAStringSet 是 Biostrings 包中的一个对象。但这没关系,即使我将字符串传递给 count_kmers,我也会收到相同的错误,但会说:

0 投票
2 回答
198 浏览

r - 如何为 data.frame 子类扩展 rbind?

我的问题是如何扩展rbind()以使用data.frame子类?rbind()即使是非常简单的子类,我似乎也无法正确扩展。以下示例演示了该问题:

子类和方法定义:

我意识到rbind()在这种情况下不需要扩展,但我的宏伟计划是rbind.data.frame()在我的子类上使用,然后在其结果中添加一些额外的检查/属性。

如果您调用以下内容,则会收到错误消息:Error in NextMethod() : generic function not specified.

不起作用:

我也尝试使用NextMethod(generic = "rbind"),但在这种情况下,您会收到此错误:Error in NextMethod(generic = "rbind") : wrong value for .Method

也不起作用:

我也束手无策,也猜测我对子类/方法的理解的局限性。谢谢你的帮助。

0 投票
1 回答
248 浏览

r - 为数组和原子向量定义自定义打印方法

我想为数组定义不同的打印方法,但恐怕我不了解 S3 调度。如果我显式调用 print(x),则会调用我的自定义打印方法,但如果我只是在控制台上键入 x,则不会调用我的自定义打印方法。但是,如果我定义了一个自定义 S3 类,则会调用相应的打印方法。

如果我尝试为 print.numeric 定义一个方法,也会发生类似的事情

这是一个最小的例子:

有没有人对正在发生的事情有任何见解?x当只是在控制台上评估时,什么函数实际上正在打印?

0 投票
2 回答
1343 浏览

r - 检查 S3 泛型/方法一致性...警告

我已经阅读了以下两个讨论:
Roxygen2 - 如何在
使用 Roxygen 构建 R 包时正确记录 S3 方法 S3 方法一致性警告
以及以下两个教程:
http ://cran.r-project.org/doc/manuals/R-exts .html#Generic-functions-and-methods
http://adv-r.had.co.nz/S3.html
但我的问题仍然没有解决。以下是详细信息:
我想在一个包中定义一个 plot() 泛型的 S3 方法,我的代码是:

运行后devtools::check(),我会收到以下警告:

好像参数label消失了,我尝试交换参数log和的位置,label后面的任何参数x都会消失function(x, log, ...),那么如何解决这个问题?

0 投票
1 回答
66 浏览

r - 在R中使用自己的方法创建新类时,为什么只输入对象名称时不自动打印?

我正在尝试构建我的第一个 R 包。我从一个简单的项目开始,它需要一个日期并将其“人性化”为“X [时间单位] 前”的格式(例如,“3 天前”、“4 年前”等)。

我希望结果有自己的打印方法,所以值有一个新类,我定义了一个 print.classname 函数。

当我运行我的新功能并输入时print(object),它按预期工作。但是当我刚进入时object,什么都没有显示。这可能是什么原因造成的?这是函数和方法的简化版本:

(更新:编辑了 humanize.now 函数,因为我对其的缩写引入了一个错误。现在生成的对象应该属于“humanize”类)

0 投票
1 回答
144 浏览

r - 将应用功能扩展到 S3(如打印或绘图)

我正在研究 R 中的一个宠物项目,该项目构建了一个名为groupr. 如Hadley 教程print.groupr中所述,我已经使用点符号 ( , )编写了一些函数,但我想扩展该函数,但找不到这样做的方法。subset.grouprapply

如教程中所示,该pryr包提供了一个提示。我看到subsetandprint函数是不同的函数类型,如下所示:

此外,该subset函数在终端中打印:

但是该apply函数会打印其整个源代码。我相信我理解为什么会发生这种情况 - print, subset, plot, 等函数是 S3 函数并且apply是一个无聊的旧正常函数 - 但我看不出有任何方法可以在apply不“覆盖”基本函数的情况下扩展函数。例如,在加载包时UseMethod("apply")将函数调用指向我的命名空间。groupr

有谁知道如何解决这个问题?也就是说,apply函数族不是 S3 对象,不能使用点符号进行扩展。有谁知道如何编写apply.myclass函数apply.myotherclass