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

r - 定义基本类的方法

为什么这行得通

但这会引发错误?

“tre”+“tri”中的错误:二进制运算符的非数字参数

0 投票
1 回答
298 浏览

r-package - R CMD 检查名称中带有点的非 S3 方法,其中点之前的部分名称与 utils 中的泛型重合

这个问题与Exporting non-S3-methods with dots using roxygen2 v4相关但不同。从那篇文章中,我了解到需要使用@export function.nameNAMESPACE 才能由 roxygen 正确写入。我已经这样做了,并且正确编写了 NAMESPACE。

当我执行 R CMD Check 时,我的问题就来了。我有具有功能的遗留代码tail.g()。R CMD Check 抛出一个注释,指出一个明显的 S3 方法已被导出但未注册。

下面是一个可重现的示例。观察它xxxx.g没有注释,这让我相信,因为tail它是 utils 包中的泛型,所以我需要一些特殊的解决方法。我不希望将 tail.g 重命名为 tail_g,因为这是遗留代码。我希望消除成功提交 CRAN 的所有注释。

给出注释:

如何在不重命名的情况下消除 tail.g() 的注释?

0 投票
1 回答
115 浏览

r - R中的动态类强制

有没有办法在 R 中动态强制对象?

背景 我正在尝试为摘要创建一个函数工厂,它可以根据传递的对象的类返回特定的方法。特别是,这是针对http://adv-r.had.co.nz/Functional-programming.html#lists-of-functions中的问题之一

实现一个类似于 base::summary() 的汇总函数,但使用函数列表。修改该函数,使其返回一个闭包,从而可以将其用作函数工厂。

例如,我尝试了一些变体,所有这些变体都是不正确/不完整的。

我想知道是否有一种方法可以动态地强制一个对象——比如 as.() 并使用它从通用对象返回适当的方法。

summary.new.list 函数

我想根据对象调用函数,例如。对于我想调用的数据框summary.new.list$df(data.frame(1:12,3,4))。虽然它现在可以工作,因为 $df 函数仍然是通用的 - 我希望从那里调用基本的 summary.data.frame 函数而不是 UseMethod

0 投票
2 回答
638 浏览

r - 在 R 包中定义自定义 dplyr 方法

我有一个包含自定义方法的包summary()print()用于具有特定类的对象。这个包还使用了出色的dplyr包进行数据操作——我希望我的用户编写使用我的包和 dplyr 的脚本。

其他人在这里这里已经注意到的一个障碍是 dplyr 动词不保留自定义类 - 这意味着ungroup命令可以剥离我的 data.frames 他们的自定义类,从而搞砸了方法调度summary等。

Hadley 说“正确地执行此操作取决于您 - 您需要为每个 dplyr 方法为您的类定义一个方法,以正确恢复所有类和属性”,我正在尝试接受建议- 但我无法弄清楚如何正确包装 dplyr 动词。

这是一个简单的玩具示例。假设我已经定义了一个cars类,并且我对它有一个自定义summary

这行得通

这就是问题所在

summary调用small_cars只是给了我通用摘要,而不是我的自定义方法,因为在 dplyr 过滤后small_cars不再保留该类。cars

我试过的

filter首先,我尝试围绕( )编写自定义方法filter.cars。那没有用,因为实际上是一个允许非标准评估filter的包装器。filter_

所以我filter_为对象编写了一个自定义方法cars,试图实现@jwdink 的建议

这不起作用 - 我得到一个无限递归错误:

我要做的就是获取传入 df 上的类,移交给 dplyr,然后返回具有与 dplyr 调用之前相同的类名的对象。 我如何更改我的filter_包装器来实现这一点? 谢谢!

0 投票
1 回答
58 浏览

r - 修改其他包中的函数类是否不明智?

在我回答我的问题之前,有一点前言,所以和我在一起!

对于我正在开发的 R 包,我想让用户尽可能轻松地部分应用内联函数。我有使用 [] 运算符来调用我的部分应用程序函数的想法,我将其命名为“partialApplication”。我的目标是:

为了实现这一点,我尝试为类函数的对象定义一个新的 [] 方法,即

但是,R 会发出警告,指出函数对象的 [] 方法已“锁定”。(有没有办法覆盖这个?)

我的想法似乎落空了,但我想到了一个简单的解决方案:我可以发明一个新的 S3 类“partialAppliable”并为其创建一个 [] 方法,即

然后,我可以使用任何我想要的函数并将“partialAppliable”附加到它的类中,现在我的方法就可以工作了。

现在这是我的问题/问题:我希望用户能够使用他们想要的任何功能,所以我想,如果我遍历活动环境中的所有对象(使用 ls)并将“partialAppliable”附加到类会怎么样所有功能?例如:

瞧!有用。(我知道,我可能应该将修改后的函数分配回它们原来的包环境,但你明白了)。

现在,我不是专业程序员,但我发现做这种事情(全局修改所有包中的所有变量)通常被认为是不明智/有风险的。但是,我想不出会出现什么具体问题。所以这是我的问题:这样做可能会出现什么问题?谁能想到这样做会破坏的特定功能/包?

谢谢!

0 投票
2 回答
998 浏览

r - 多个类的 S3 运算符重载

我定义了两个类,它们可以成功添加两个自己的对象或一个数字和一个自己的对象。

但很明显,当我尝试添加两个自定义类时会出错。

我可以只为 customClass1 定义一个函数,但是当我尝试添加两个 customClass2 对象时,该函数将不起作用。有没有办法将一个功能优先于另一个功能?

R 似乎通过将我的函数优先于基本函数(例如数字或整数类型)来自然地做到这一点。当两个参数之一具有 customClass 类型时,R 会自动将其重定向到我的函数而不是默认函数。

0 投票
1 回答
510 浏览

r - S3 类的通用打印功能

我有一个 S3 课程,我正在尝试研究如何为其设置打印功能。

这部分很好。

但是,如果我运行devtools::check()它,我会收到以下不祥的消息:

我尝试添加附加代码:

但是,有了这个礼物,print.webglobe()似乎永远不会被访问,我的 S3 类只是打印为某种列表。

如何正确设置?

0 投票
1 回答
517 浏览

r - R S3 类:在覆盖与附加类属性的类名之间做出决定

我想创建一个 S3 类。我如何确定哪种设置类属性的方式是正确的(因为它会有所不同)?

1)覆盖类属性

2)附加类属性

我还可以附加类名(在开头或结尾):

我知道在开头和结尾添加类名可能会更改被调用的函数(从?class):

当泛型函数 fun 应用于具有类属性 c("first", "second") 的对象时,系统会搜索名为 fun.first 的函数,如果找到,则将其应用于对象。如果没有找到这样的函数,就会尝试一个名为 fun.second 的函数。如果没有类名产生合适的函数,则使用函数 fun.default(如果存在)。

例如。如果我定义一个重载函数,它并不总是被调用:

所以我的问题是:我如何决定如何设置类名(我必须考虑哪些[其他]标准)?

0 投票
0 回答
60 浏览

r - R:为矩阵重写“[”的行为?

我正在尝试附加“矩阵”类,然后覆盖“[”的默认行为。下面的代码示例:

基本思想是使矩阵在子集后保留其特定属性。

但是我遇到了一个问题:

如何编写“[”函数,使其在使用和不使用逗号时表现不同:

作为矩阵的默认“[”似乎可以做到。

我正在考虑将第二个参数默认设置为某个值,但是由于添加了逗号,该值不会改变。

0 投票
2 回答
163 浏览

r - R 对象的名称承载多个功能

根据我阅读Hadley 关于构建 S3 对象的建议,我正在使用辅助函数、构造函数和验证器函数。一个简单的可重现示例:

我希望生成的对象包含一个带有传入项目的原始名称的值($x_name在上面的示例中)。如果我直接调用构造函数,这个deparse(substitute(...))技巧就有效:

但如果我使用辅助函数则不是:

我也想test_helper$x_name退货[1] "alpha"

如果没有在帮助器阶段执行该deparse(substitute(...))步骤,构造函数 ( )是否可以通过帮助器new_test_object()访问对象的“原始”名称?x或者确保它的名称随着辅助函数传递给构造函数而传递?