问题标签 [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 S4 类
假设有两个包。
Package_A 有这个类:
Package_B 有一个类似的类:
所以用户已经在他们的工作环境中加载了这两个包:
在这个用户的工作环境中,R 如何解决创建“Person”对象的困惑:
在此用户的工作环境中,R 如何解析调用正确的方法:
r - 如何将 S3 方法声明为默认加载环境?
在一个包中,我想为 object 调用一个 S3 方法“compact” foobar
。
因此compact.foobar
,我的包中将有一个函数以及compact
函数本身:
但是,后者会与purrr::compact
.
我可以默认使用purrr
(compact.default = purrr::compact
或可能
compact.list = purrr::compact
)的方法,但如果用户没有purrr
加载,那将毫无意义。
compact
如何在用户环境中将我的方法默认为加载的 , 版本?(以便它使用purrr::compact
、任何其他声明compact
的函数,或丢失函数失败)
r - 来自导入包的“已覆盖注册的 S3 方法”消息
每当我加载我的包裹时,我都会收到以下消息:
事实上,我使用了这两个函数expss
和Hmisc
我的包中的函数。以下是 NAMESPACE 中的相关行:
但是,没有导入任何 S3 方法。
我使用 RStudio,NAMESPACE 是由roxygen2
. 我没有声明与这些函数相关的其他 S3 方法。
我知道我只能使用一个包,但这不是我要问的(我不明白这个问题可能意味着更深层次的问题,我想保持与两个包的兼容性)。
此外,我想知道提到的事实print.labelled
是否意味着我的包裹中有打印参考,这将是非常出乎意料的。(Ctrl+ Shift+ Fonprint
仅指向示例或小插曲)
如果我什至不首先导入它们,为什么这些方法会被覆盖?
r - R中用于继承自定义数据框类的列的函数
我有一个数据框列表
并编写了一个函数来为每个数据框附加一个自定义类:
有用!
但现在我想使用类继承让每个数据框中的列分别继承foo
、bar
和custom
类 - 我该怎么做?
期望的输出
我对使用 S3 非常陌生,因此不胜感激!
r - 方法分派时 UseMethod 出错
我尝试使用以下代码创建一个方法,但是当我使用名为“tutu”的通用函数时,我收到以下错误,而其他函数(tutu.num 和 tutu.ch)工作。请你能帮我理解错误在哪里吗?我希望“tutu”函数能够识别该类并使用示例中为 tutu.num 的函数的适当方法。谢谢!
UseMethod(“tutu”)中的错误:没有适用于“tutu”的方法应用于类“c('integer','numeric')”的对象
r - 创建从数据框继承的 S4 类
我正在写一个 R 包。在这个包中,我希望有一种特殊类型的数据框,一些函数可以识别它,具有一些额外的属性,比如说,但在其他方面表现得与数据框完全一样。实现我想要的一种方法就是在常规数据框上设置一些属性:
当dosmth()
接收到“myDF”时,它有关于数据帧来源的附加信息:
同样,使用 S3 会相当简单,我们甚至可以利用方法分派编写不同的 dosmth 变体。我如何用 S4 做到这一点?
roxygen2 - 如何扩展包的 S3 方法的文档?
在我的包中,我as_bar
从包中扩展了一个 S3 方法pcp_pack
,应用于foo
我的包中的一个对象foo_pack
。
ROxygen2 文档如下:
但是,这个功能是相当独立的,它可以在没有原始包的情况下工作。但是为了让函数在不必运行的情况下工作library(pcp_pack)
,我必须重新导出通用方法(我从dplyr reexportmagrittr
复制了重新导出的语法),所以 R 知道它应该调用一个方法:
这完美地工作,并且as_bar
适用于foo
对象以及其他对象。
但是,文档并不完美,运行library(foo_pack);?as_bar
会给出两个结果:
- man of ,用法中
pcp_pack::as_bar
未提及as_bar.foo
- man of
foo_pack::as_bar
, withas_bar.foo
in the usage 但没有别的
提前运行library(pcp_pack)
不会改变任何事情。
我怎样才能得到一个统一的版本?as_bar
,所有加载的包的所有用法,无论它们是什么?
编辑
相关但有点不同且未回答:在 R 中记录通用 S3 方法以便用户可以查看文档?
如果你想要一些上下文,我的包是交叉表的,我想
as_flextable.crosstable
从flextable::as_flextable
.
r - R中数据框中每个元素的自定义类
我对 S3 很陌生,想知道是否有可能给出以下数据框:
我可以给列中的每个元素elements
一个来自 S3 列的自定义类:
但这不起作用。这是由于我对 S3 的理解存在心理模型差距吗?是否可以以这种方式对每个元素应用不同的类,如果不能,可以以某种方式将输出创建为列表,以便列表中的每个元素都是一个element
with class S3
?任何提示/帮助建议表示赞赏!
r - 在 R 包中定义 S3 方法而不引入依赖项的首选方法是什么?
我有一个 R 包(目前不在 CRAN 上),它定义了一些来自其他包(特别是knitr::knit_print
和huxtable::as_huxtable
)的通用函数的 S3 方法。但是,它们不是我的包的关键部分,所以我不想在用户安装我的包时创建对这些包的依赖。直到 R 4.0.0,我导出了 S3 方法而不导入泛型。使用roxygen2
,我的@export
指令被翻译成export()
NAMESPACE 中的指令,而不是S3method()
. 这在 R 版本 < 4.0.0 中运行良好,因为 Rgeneric_function.class
首先在全局环境中查找匹配方法,而不是依赖于 S3 方法的正确注册。但是,根据developer.r-project.org 上的这篇博客,R 不再寻找未注册的 S3 方法。
解决这个问题的最好方法是什么?现在,我已将@importFrom
指令添加到我的roxygen2
块中,并将两个包添加到说明的导入部分。但是,据我了解,这意味着任何安装我的软件包的用户也必须安装knitr
,huxtable
无论他们是否愿意。
r - S3中的美元建议方法
我现在正在制作一个 R 包,我必须在返回列表和具有 S3 属性的对象之间进行选择。至于列表,好处是对于初学者来说非常容易使用,因为美元符号使所有元素都易于找到。不好的是,它消除了直接继承(我想返回一个带有一些附加信息的 ts 对象)。
另一种方法是为我的 S3 课程设置美元,如下例所示:
但是,我对此有两个问题:
- 在哪里设置美元部分匹配功能,以便用户在 rstudio 中将“MyAttribute”视为有效选择?
- 此外,这是一个很好的做法还是我应该继续使用简单的列表
谢谢