问题标签 [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 - 使用 S3 通用函数获取数据类型列表
我尝试编写一个函数,我可以在其中输入任意数量的对象并获取该对象的数据类型列表。这是学习 S3 泛型的个人任务。
到目前为止我所做的是:
例如当我打电话时发生错误
我总是得到错误:"Error in apply(dots, 1, myType) : dim(X) must have a positive length"
我不确定出了什么问题。有人可以在这里帮助我吗?因为我对 RI 完全陌生,所以可能做一些基本错误的事情。
r - S3 本地环境方法,无环境
我正在阅读以下 S3 教程:http ://www.cyclismo.org/tutorial/R/s3Classes.html
我喜欢“本地环境方法”(并且可以忍受它的缺点)。但是我不明白为什么要手动创建本地环境。为什么我们不直接使用函数环境呢?
即使没有“额外”环境,以下内容似乎也有效:
我在这里想念什么?
r - 如何在不使用 Depends 或 library() 的情况下使用另一个包中的 S3 方法,该包在其命名空间中使用 export 而不是 S3method
我目前正在研究 R 包,并尝试遵循 Hadley Wickham 在http://r-pkgs.had.co.nz提供的最佳实践指南。作为其中的一部分,我的目标是将所有包依赖项都放在说明文件的 Imports 部分而不是 Depends 中,因为我同意不要不必要地改变全局环境的理念(许多 CRAN 和 Bioconductor 包不这样做'似乎没有跟随)。
我想在我的一个包函数中使用 Bioconductor 包 rhdf5 中的函数,特别是h5write()
. 我现在遇到的问题是它没有在其 NAMESPACE 中声明其 S3 方法。它们是使用(例如)声明的
而不是
通用 h5write 定义为:
实际上,这意味着调用 rhdf5::h5write 失败,因为没有注册适当的 h5write 方法。
据我所知,解决方案有以下三种:
- 使用
Depends
而不是Imports
在说明文件中。 - 在相关功能的代码中使用
library("rhdf5")
或require("rhdf5")
。 - 修改 rhdf5 的 NAMESPACE 文件以使用
S3methods()
而不是export()
.
所有这些都有缺点。选项 1 意味着即使我的包中的相关函数从未被调用,该包也已加载并附加到全局环境。选项 2 表示library
在包中使用,同时又将包附加到全局环境,并且根据 Hadley Wickham 的指南也已弃用。选项 3 意味着依赖其他包作者在 Bioconductor 上更新他们的包,也意味着不再导出 S3 方法,这反过来可能会破坏其他依赖显式调用它们的包。
我错过了另一种选择吗?我在 StackOverflow 上查看了其他地方,发现了以下一些相关的问题Importing S3 method from another package和
How to export S3 method so it is available in namespace? 但没有任何东西可以直接解决我的问题。值得注意的是,与这两者中的第一个的主要区别在于泛型和方法都在同一个包中,但问题是使用export
而不是S3method
.
重现错误的示例代码(无需创建包):
或者,在https://github.com/NikNakk/s3issuedemo有一个骨架包,它提供了一个demonstrateIssue()
重现错误消息的函数。它可以使用devtools::install_github("NikNakk/s3issuedemo")
.
sql - 扩展dplyr和使用内部函数
我正在研究RSQLServer
包的一个分支,并试图实现连接。使用当前版本的包,任何 DBI 连接数据库的连接都使用sql_join.DBIConnection
. 但是,该实现不适用于 SQL 服务器。例如,它使用USING
SQL Server 不支持的。
我有这个功能的一个版本sql_join.SQLServerConnection
工作(虽然还没有完成)。我sql_join.DBIConnection
尽可能地基于我的功能。我遇到的一个问题是sql_join.DBIConnection
在dplyr
诸如common_by
. 目前,我已经通过使用来解决这个问题dplyr:::common_by
,但我知道这不是理想的做法。
我是不是该:
- 请 Hadley Wickham/Romain Francois 导出相关功能,让开发基于
dplyr
? - 将内部函数复制到我正在处理的包中?
- 继续使用
:::
运算符调用函数? - 还有什么?
显然,对于选项 3,界面有可能会发生变化(因为它们不是导出的函数)并且包会在较长时间内损坏。
示例代码:
r - Print method with user classes
I'm experimenting with S3-class
methods and generic functions, but I'm having an issue which I think highlights a misunderstanding in my thinking. Perhaps I'm getting confused with how printing works, or how storing values
and attributes
works internally?
I've tried to google around to no avail, possibly because I'm not too sure what I'm looking for.
Setup
Class methods
Printing coverageB
without loading print.coverage
gives
where I'd like some way to print just the 0.3333333
.
Help would be much appreciated. Thanks.
(As a side note, I'm sure that eval(parse(...))
statement is not the right way to do things. Any pointers there would be appreciated too.)
I also wasn't sure what to title this - if anyone has any more appropriate suggestion I'm happy to change it.
r - 为“函数”类对象导出 S3 方法
函数对象似乎与 S3 方法的调度配合得很好。
但由于某种原因,它们无法在 NAMESPACE 文件中导出。
下面的代码适用于分派到*.function
方法:
但是当我尝试将 NAMESPACE 中的导出定义为:
它在R CMD 检查时引发错误:
我也尝试过换行,`
但也无济于事
导出函数类的方法的正确方法是什么?
r - 如何为新的 S3 类导出新的通用函数?
我定义了一个work_with_myS3
应该与我的新 S3 类一起使用的新函数myS3
:
当我在正常的 R 会话(我正在使用 RStudio)中获取它时,它的行为完全符合预期。当我喂它一个myS3
物体时,它就起作用了;当我喂它一些奇怪的东西时,它会抛出一个错误:
但是,当我将它包含在我的包中时,构建它,重新加载它并尝试调用它:
帮助页面工作正常,但调用?work_with_myS3
. 这就是我记录它的方式devtools::document()
:
命名空间中还有一个条目:
为什么会这样,以及如何使该功能在包中可用?我怀疑我犯了一些小错误。
r - 重载 S3 写函数
我目前正在研究 S3 类,试图为我的类生成一个写入函数。只是一个最小的例子:
那么,为什么写不使用正确的写呢?
解决方案:
r - 如何将一个类的对象与泛型的另一个对象相同
我已将一个对象分类为 NewClass,我如何在对象上使用一个函数,比如 plot,就好像它是一个已知类的对象,比如 hist?
r - 在 R 中定义一类新的函数
因此,我正在更改我在 R 中构建的一些函数的类,以便添加描述属性,并且因为我想使用 S3 泛型来为我处理所有事情。基本上,我有一个类似的结构
然后我做类似的事情
这工作正常,但它不是那么优雅。我想知道是否可以定义一个新的函数类,以便可以用类似于语法的语法来定义此类的实例function
。换句话说,是否可以定义addFunction
以foo
下列方式生成的:
(或类似的东西,我对应该将属性添加到函数的哪个位置没有强烈的感觉)?
谢谢阅读!
更新:我对这个想法做了更多的试验,但还没有真正达到任何具体的结果——所以这只是我当前(更新)对该主题的想法的概述:
我尝试了只复制function()
-function 的想法,给它一个不同的名称,然后再对其进行操作。但是,这不起作用,我很想对这里发生的事情进行任何输入:
作为function()
一个原始函数,我尝试查看定义它的 C 代码以获取更多线索。我对电话中的错误信息特别感兴趣function2(x)
。底层的 C 代码function()
是
由此,我得出结论,出于某种原因,现在需要四个参数、和 中call
的至少两个。根据我的签名,我猜测传递给的四个参数应该是一个调用、一个承诺、一个参数列表,然后可能是一个环境。我尝试了很多不同的组合(包括将这些参数中的两个设置为 NULL),但我不断收到相同的(新)错误消息:op
args
rho
do_function()
do_function
function2
这个错误信息是从 C-function 返回的CheckFormals()
,我也查了:
我一点 C 语言都不流利,所以从这里开始我不太确定下一步该做什么。
所以这些是我更新的问题:
- 为什么不以同样
function
的function2
方式行事?function2
当它们在 R 中被视为相同时,为什么我需要使用不同的语法进行调用? - 真正定义函数的正确参数是
function2
什么?function2([arguments])