问题标签 [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 - 在 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")
.
在从其组成功能构建包的过程中,范围界定是否发生了某些事情,这阻止了它的工作?
r - 包中的递归 S3 调用
我想要完成的
我有一个 R 包,其中包含一些以递归方式使用的内部 R 函数(在下面的示例中称为 f 和 g)。在最小示例中,函数只返回其参数的长度,但在实际代码中,它们会触发更复杂的计算。
我想要做的是以下内容:
如果用户将对象传递给函数 g,R 应该查找我们是否有可以调用该对象的 S3 方法。
如果对象是一个列表,函数 g 应该应用于列表中的每个对象。如果我们还没有达到最大递归深度,请转到 1。如果我们达到最大递归级别,请停止。
显示问题的代码
将以下代码放入包中很重要。我得到的错误只有在代码是包的一部分时才能重现。
utils.R
core.R
我的期望
错误
结果应该是 6;
但我收到一条错误消息:
通行证
结果应该是 3。
评论
当我调用该示例时,该示例失败,在将函数 g 加载到全局命名空间后,我得到了预期的结果 6。
所以我认为这是一个与命名空间/S3 相关的问题,但我不知道如何解决它。
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_class
inst
baz
只有这个list2env
调用才能让这里的事情保持整洁,在一个更复杂的例子中可能会搞砸。
我确实喜欢这段代码在视觉上封装函数的方式my_class
,所以我很好奇我是否在这里做一些事情,或者我是否正在全力以赴。Stack Overflow 的居民们,你们怎么说?这是好还是坏的风格?
r - R的'as'函数的类型/起源
R 的 S3 OO 系统以泛型函数为中心,泛型函数调用方法取决于调用泛型函数的对象的类。关键是通用函数调用适当的方法,而不是在类中定义方法的其他 OO 编程语言。
例如,该mean
函数是通用函数。
这将打印
我正在探索 R 并找到了该as
功能。我对 R 说函数不是通用的,但它仍然有方法这一事实感到困惑。
最后有一个警告说这as
不是通用的。
有人可以解释一下这个as
功能是什么以及如何连接as.list
等as.data.frame
吗?R 说这as.list
是一个泛型(我很想对 R 中的不一致感到有点生气,因为我希望成为泛型函数的对象as.list
的方法)。请帮忙。list
as
r - R CMD 检查不识别 S3 通用方法
我正在编写一个包,如果我在我的 Rstudio 中运行代码,它会运行,但是当我将它交给 R CMD check 运行时,它无法识别 S3 方法。我有一个通用方法:
然后是替代方法:
现在我在文档中运行的一个示例是:
如果我将代码作为普通代码运行,它可以工作,但如果我使用 R CMD check 检查它,它会抱怨:
AAStringSet 是 Biostrings 包中的一个对象。但这没关系,即使我将字符串传递给 count_kmers,我也会收到相同的错误,但会说:
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
。
也不起作用:
我也束手无策,也猜测我对子类/方法的理解的局限性。谢谢你的帮助。
r - 为数组和原子向量定义自定义打印方法
我想为数组定义不同的打印方法,但恐怕我不了解 S3 调度。如果我显式调用 print(x),则会调用我的自定义打印方法,但如果我只是在控制台上键入 x,则不会调用我的自定义打印方法。但是,如果我定义了一个自定义 S3 类,则会调用相应的打印方法。
如果我尝试为 print.numeric 定义一个方法,也会发生类似的事情
这是一个最小的例子:
有没有人对正在发生的事情有任何见解?x
当只是在控制台上评估时,什么函数实际上正在打印?
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, ...)
,那么如何解决这个问题?
r - 在R中使用自己的方法创建新类时,为什么只输入对象名称时不自动打印?
我正在尝试构建我的第一个 R 包。我从一个简单的项目开始,它需要一个日期并将其“人性化”为“X [时间单位] 前”的格式(例如,“3 天前”、“4 年前”等)。
我希望结果有自己的打印方法,所以值有一个新类,我定义了一个 print.classname 函数。
当我运行我的新功能并输入时print(object)
,它按预期工作。但是当我刚进入时object
,什么都没有显示。这可能是什么原因造成的?这是函数和方法的简化版本:
(更新:编辑了 humanize.now 函数,因为我对其的缩写引入了一个错误。现在生成的对象应该属于“humanize”类)
r - 将应用功能扩展到 S3(如打印或绘图)
我正在研究 R 中的一个宠物项目,该项目构建了一个名为groupr
. 如Hadley 教程print.groupr
中所述,我已经使用点符号 ( , )编写了一些函数,但我想扩展该函数,但找不到这样做的方法。subset.groupr
apply
如教程中所示,该pryr
包提供了一个提示。我看到subset
andprint
函数是不同的函数类型,如下所示:
此外,该subset
函数在终端中打印:
但是该apply
函数会打印其整个源代码。我相信我理解为什么会发生这种情况 - print
, subset
, plot
, 等函数是 S3 函数并且apply
是一个无聊的旧正常函数 - 但我看不出有任何方法可以在apply
不“覆盖”基本函数的情况下扩展函数。例如,在加载包时UseMethod("apply")
将函数调用指向我的命名空间。groupr
有谁知道如何解决这个问题?也就是说,apply
函数族不是 S3 对象,不能使用点符号进行扩展。有谁知道如何编写apply.myclass
函数apply.myotherclass
?