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

r - S3 函数重载中的省略号应该放在哪里?

我们有一个我们定义的 S3 类plot和其他通用函数。我们不确定...必须去哪里。有两种选择:

  1. plot.hadronacf(x, col = "black", ...)
  2. plot.hadronacf(x, ..., col = "black")

同样对于print.summary.

在它的用法上summary似乎不一致:

因为print省略号似乎结束了:

似乎大多数情况下都使用最后的省略号。对此有一些指导方针吗?

0 投票
1 回答
99 浏览

r - mlr 包 - 尝试集成一个新的聚类学习器。par.vals 中的默认值被忽略(在 makeRLearnerCluster 方法中)

我正在尝试将包 ClusterR 的 MiniBatchKmeans 功能集成到 mlr。根据文档,我做了以下更改:

  1. 创建 makeRLearner.cluster.MiniBatchKmeans
  2. 创建 trainLearner.cluster.MiniBatchKmeans
  3. 创建 predictLearner.cluster.MiniBatchKmeans
  4. 注册了上述 S3 方法(如此处所述

在这一点上,我能够创建学习器,并调用训练和预测它们。但是,当尝试创建没有提供任何“集群”值的学习器时,就会出现问题。

底层包(在ClusterR中)没有为参数“clusters”定义的默认值。根据 mlr 方法,我尝试使用 par.vals 参数提供“集群”的默认值。但是,忽略此默认参数。

我的代码:

问题(忽略上面 par.vals 中集群的默认值):

关于我为什么会看到这种行为的任何建议?我检查了其他学习者(如 cluster.kmeans、cluster.kkmeans 等)的代码,我发现他们能够以与我所做的相同格式成功定义默认值。此外,这里有文档证明这是正确的方法。

这是在 github 上的代码,以防它有助于重现问题。有一个添加的测试文件(在 tests/testthat 中),但它有其自身的问题。

编辑 1 - 实际错误消息 这是我在尝试训练学习者时看到的实际错误消息,而没有明确提供“集群”的默认值:

0 投票
2 回答
267 浏览

r - 在R中的通用函数中执行`UseMethod()`之后的代码?

我想要以下通用功能,

  1. 检查这些 allowedFormats (这有效),
  2. 比基于参数 x 的类型执行通用函数(有效)
  3. 在调用后评估语句UseMethod()(不起作用 - 正如预期的那样)

现在它在帮助中说明UseMethod

调用 UseMethod 之后的任何语句都不会被评估,因为 UseMethod 不会返回。

所以这并不奇怪。但是,除了定义一个validate_after()调用validate()后跟的附加函数之外,有没有一种方法可以实现这一点cat(“Validation completed”)

0 投票
0 回答
74 浏览

r - 在 R 中记录通用 S3 方法以便用户可以查看文档?

我正在print()通过一种方法扩展功能print.dmdSchemeSet()。这个函数有额外的参数,我显然已经使用 roxygen2 在源文件中记录了这些参数:

现在该函数仅作为通用函数导出,这很好,并且可以正常工作。

但是用户如何查看这些函数的文档呢?

我可以以这样一种方式制作文档,以便用户可以直观地找到它吗?

0 投票
1 回答
32 浏览

r - 获取从 S3 类及其父类继承的方法

如果我有一个从父类继承的 S3 类,我如何返回我可以调用的泛型方法列表 - 既来自 S3 类,也来自父类。

所以创建的对象的类是: c("my_s3_class", "parent_s3_class")

以下适用于返回方法my_s3_class

但它不包括可调用的泛型函数,而仅在父级中实现parent_s3_class

最终,我想使用类似下面的方法调用每个方法(这可行,但不包括父泛型方法)。使用get()意味着我不能使用NextMethod(),否则这将是一个合理的解决方法。my_s3_class注意我有一个我已经表示为的实例my_s3_class_instance- 这只是一个实现细节。

有任何想法吗?谢谢!

0 投票
2 回答
180 浏览

r - 混合 S3 和 S4 时的方法调度

我想了解混合 S3 和 S4 时 R 找到适当功能的步骤。这是一个例子:

我不完全理解执行最后一行时会发生什么。

multcomp::cld打印UseMethod("cld"),所以 S3 方法调度。

isS4(l)表明这l是一个 S4 类对象。

看起来,尽管调用了 S3 泛型,但 S3 调度系统被完全忽略了。创建一个函数print.lsmobj <- function(obj) print('S3')(因为class(l)lsmobj)并运行cld(l)不打印"S3"

showMethods(lsmobj)showMethods(ref.grid)(超类),不要列出任何类似于cld函数的东西。

使用debugonce(multcomp::cld)表明最终调用的函数cld.ref.grid来自lsmeans

但是,我想知道如何实现cld.ref.grid最终会在没有任何“技巧”的情况下调用debugonce. 也就是说,R 执行的步骤是什么cld.ref.grid

0 投票
2 回答
207 浏览

r - 导入包的 S3 方法而不导入其函数

我正在开发的包中有以下依赖链:

  • 我的包使用trajectory包 A ( ) 中定义的类 ( simmer)。
  • 它还为该类 ( plot.trajectory) 使用 S3 方法,该方法在包 B ( simmer.plot) 中定义。
  • 我可以将包 A 作为一个整体导入,但我不能将包 B 作为一个整体导入,因为它包含对包 A 中定义的其他函数(get_mon函数)的替换,所以我收到关于原始函数被替换的不需要的警告。

如何在不导入包 B 的其余部分的情况下使用/导入 S3 方法,最好是通过roxygen2

roxygen2文档建议以下内容

如果您想向 S3 泛型添加新方法,请使用 @importFrom pkg generic 将其导入。

对于我的示例,这将是,但这会返回一个不是由 导出@importFrom simmer.plot plot的警告。如果我先导入泛型,使用.plotsimmer.plot@importFrom graphics plot

0 投票
2 回答
90 浏览

r - R中不接受输入的替换函数

这似乎与已提出的其他几个问题(例如这个)非常相关,但我无法完全弄清楚如何做我想要的。也许替换函数是错误的工作工具,这也是一个完全可以接受的答案。我对 Python 比对 R 更熟悉,我可以很容易地想到我想在 Python 中如何做,但我不太清楚如何在 R 中处理它。

问题:我试图在函数中修改一个对象,而不必返回它,但我不需要传入修改它的值,因为这个值是已经包含的函数调用的结果在对象中。

更具体地说,我有一个列表(从技术上讲,它是一个 s3 类,但我认为这实际上与这个问题无关),其中包含一些与以processx::process$new()call 开头的进程相关的内容。为了重现性,这里有一个可以运行的玩具 shell 脚本,以及获取我的res对象的代码:

然后我的包装是这样的:

应该res看起来像

所以,这里的具体问题有点特殊,process$new但我认为一般原则是相关的。我试图在完成后收集该进程的所有输出,但您只能调用process$new$read_all_output_lines()(或它的兄弟函数)一次,因为它第一次将从缓冲区返回结果,而随后它什么也不返回。另外,我将调用其中的一堆,然后再回来“检查它们”,所以我不能立即调用res$process$read_all_output_lines(),因为它会在函数返回之前等待进程完成,这不是我的想。

所以我试图存储该调用的输出,res$output然后保留它并在后续调用中返回它。Soooo ...我需要一个功能resres$output <- res$process$read_all_output_lines()来修改

这是我尝试过的,基于这样的指导但没有奏效。

get_output(res)第一次调用有效,但它不会将输出存储res$output到以后访问,因此后续调用什么也不返回。

我也尝试过这样的事情:

这只是扔掉了,value但这感觉很愚蠢,因为你必须用get_output(res) <- "fake"我讨厌的任务来调用它。

显然我也可以只返回修改后的res对象,但我不喜欢这样,因为用户必须知道该怎么做res <- get_output(res),如果他们忘记这样做(第一次),那么输出就会丢失到以太并且永远不会恢复了。不好。

任何帮助深表感谢!

0 投票
1 回答
93 浏览

r - R使用面向对象编程(S3和S4)将多个函数转换为一个对象

我试图了解如何将函数转换为 R 中的面向对象编程。例如,如何使用 S3(然后是 S4)将下面的数据和 2 个函数转换为一个对象?(也许其他一些简单的数据和函数可以更好地作为示例?)

以及如何使用 OOP 执行以下功能。

0 投票
2 回答
165 浏览

r - R S3 类 - 更改类并传回相同的方法

我有一个关于在 R 中使用 S3 类做某事的“正确”方法的问题。我想做的是有一个方法来更改类,然后在新类上调用相同的方法。像这样的东西:

这有效。当我执行以下操作时,我都可以character上课

我的问题是:这是正确的方法吗?在我转换类之后(这一行res <- my_func(.x))重新调用相同的方法感觉很奇怪。

我觉得NextMethod()必须以某种方式成为答案,但我已经阅读了一堆关于它的文档(例如thisthis)但他们都在谈论这件事,它正在跳到类列表中的下一个类,比如从例如data.frame,直到matrix您拥有class(df)并获得c("data.frame", "matrix")

但是他们都没有谈论这种情况,即您将其转换为不在原始层次结构中的完全不同的类。所以也许NextMethod() 不是正确的使用方法,但还有其他东西,还是我应该像拥有​​它一样离开它?

谢谢!