问题标签 [s4]
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 对象无法传递给 Fortran
我使用Rbdiag
中包中的函数Matrix
生成对角矩阵,然后将结果矩阵(称为mat
)传递给自写的函数,但由于以下错误,R 无法执行:
Error: invalid mode (S4) to pass to Fortran (arg 1)
我查了一下isS4(mat)
,是的TRUE
。因此,我想有一种方法可以以某种方式转换 S4 对象以便传递给函数。任何建议将不胜感激!
更新:我使用以下代码构建块对角矩阵:
有没有其他方法可以在不使用该bdiag
函数的情况下获得 S3 矩阵?谢谢!
r - 如何在 R 中访问 S4 对象的插槽
我在一个程序上使用小波,我使用这个包wavelets
使用函数创建时间序列的 DWT dwt
。这个函数返回一个 class 的对象dwt
,它是一个有很多槽的 S4 对象:W
, V
, levels
, filter
, 等等。
如何将W
's 作为向量访问?
multithreading - 在 S4 类中创建并行集群
可能重复:
S4 类:每个插槽多个类型
我正在尝试制作我的第一个 R 包。我计划创建一个 S4 类“测试”,其中包含数据和一些处理数据的方法。就我而言,可以通过多线程来改进数据的处理。我已经测试过parLapply()
了,它提高了性能。
问题是我不想打电话:
在我想要并行的每种方法中。这是因为它不优雅,而且我认为是线程成本团队的重复创建(和破坏)。
因此,我正在考虑(只是)cluster
在我的班级“测试”中有一个对象。然后我可以,例如,制作一个“测试”对象“o”并调用一个“测试”方法setNumbrOfThreads(o) <- 4
。
但是,我在实施方面遇到了麻烦。由于?makeCluster()
声明返回值为'''类'c(“SOCKcluster”,“cluster”)'''的对象,我尝试过:
R 抱怨说element 3 of the representation was not a single character string
。所以我尝试了没有更多的成功:cluster = "cluster"
或cluster = "SOCKcluster"
(代表)。
我的问题是:
如何使用类 c("SOCKcluster", "cluster") 的成员对象创建 S4 类?
谢谢,
r - 当涉及 S4 代码时,testthat::auto_test() 似乎失败了
在过去的几周里,我一直在将testthat包的单元测试功能越来越多地集成到我的日常工作中,并且真的不得不说:这个包太棒了!
我特别喜欢自动测试功能,每次您在代码中的某个位置进行更改时,它都会自动运行您的所有单元测试。但是,我认为在您的代码目录包含 S4 定义(类、通用方法、自定义方法)的情况下使用testthat的函数时,我遇到了一个小错误或至少一些不良行为。auto_test()
问题
下面说明的这种行为是错误还是我在使用时做错了什么auto_test()
?
下面你会找到一个需要先创建一些示例文件的插图
预赛
设置工作目录
确保目录
创建 S4 参考类定义
classes.R
在目录中创建文件src
创建通用方法定义
generics.R
在目录中创建文件src
创建自定义方法定义
methods.R
在目录中创建文件src
创建单元测试
创建文件test_getName_ref.R
和test_setName_ref.R
目录tests
插图
运行auto_test()
会报错:
我的第一个猜测是,这可能与testthat::source_dir()
处理采购的方式有关,可能是由于争论env
?
为了继续,我们需要使用 CRTL + BREAK 关闭自动测试(在 Windows 上;如果您在其他平台上,请参阅本文中的“自动测试”部分)
现在,当我们第一次手动获取代码并运行test_dir()
时,一切似乎都运行良好:
r - Rd file name conflict when extending a S4 method of some other package
Actual question
How do I avoid Rd file name conflicts when
- a S4 generic and its method(s) are not necessarily all defined in the same package (package containing (some of) the custom method(s) depends on the package containing the generic) and
- using
roxygenize()
from package roxygen2 to generate the actual Rd files?
I'm not sure if this is a roxygen2
problem or a common problem when the generic and its method(s) are scattered across packages (which IMHO in general definitely is a realistic use-case scenario if you follow a modular programming style).
What's the recommended way to handle these situations?
Illustration
In package pkga
Suppose in package pkga
you defined a generic method foo
and that you've provided the respective roxygen code that roxygenize()
picks up to generate the Rd file:
When roxygenizing()
your package, a file called foo-methods.Rd
is created in the man
subdirectory that serves as the reference Rd file for all methods that might be created for this generic method. So far so good. If all of the methods for this generic are also part of your package, everything's good. For example, this roxygen code would make sure that documentation is added to foo-methods.Rd
for the ANY
-method of foo
:
However, if package pkga
provides the generic for foo
and you decide in some other package (say pkgb
) to add a foo
-method for x
being of class character
, then R CMD check
will tell you that there is a name clash with respect to Rd file names and/or aliases (as there already exists a Rd file foo-methods.Rd
in pkga
):
In package pkgb
To be more precise, this is the error that's thrown/written to file 00install.out
Due dilligence
I tried to change the values for @rdname
and @aliases
to foo_pkgb*
(instead of foo*
), but \title
and \name
still are set to foo
when roxygenizing and thus the error remains. Any ideas besides manually editing the Rd files generated by roxygenize()
?
EDIT 2012-12-01
In light of starting the bounty, the actual question might get a slightly broader flavor:
How can we implement some sort of an "inter-package" check with respect to Rd files and/or how can we consolidate S4 method help files scattered across packages into one single Rd file in order to present a single source of reference to the end-user?
r - R:在继承 data.frame 的 S4 对象上应用 terms.formula
我正在尝试创建一个从数据框继承的新类:
这是该类的一个实例,用于测试:
只是为了确保它看起来没问题...
...并确保继承有效
这是我在尝试利用作为数据框的属性时遇到的问题:
我可能错过了一些愚蠢的事情。如果是这样,在此先感谢您指出。
如果我对这里的问题是正确的,那么无论如何我可以让 terms.formula 认识到我给它一个 data.frame 的事实吗?
r - 如何在 R 中创建一个允许类向量索引的 S4 类?
我想在 R 中创建一个新类,它基本上应该类似于向量类,只是向量中的每个元素都有两个附加属性,分别是“开始时间”和“结束时间”。部分功能应该是各种常规索引。
我尝试过在这里至少提供一些代码:
这显然不起作用,因为之后
和
示例 [1:3] 例如给我 NA NA NA。
还是让我自己写getter,从类似的东西开始
? 当然我想避免这种情况,因为我不知道如何正确处理参数 x,i,j,drop。
我需要插槽“数字”吗?有没有一种从虚拟类向量继承的方法允许我省略它?此外,我不想将结构限制在包含数值的向量上。
我希望这个问题不是太微不足道,但是我阅读了书籍和 pdf 中的不同章节,却没有自己找到解决方案。
提前非常感谢。
米卡
r - 使用roxygen2时如何指定加载S4方法的顺序
我已经多次遇到以下问题。
假设您有两个类,classA
并classB
在以下文件中进行了描述classA.R
:
和classB.R
我相信这些文件是按字母顺序阅读的roxygen2
,但事实并非如此。如果我尝试构建包,我可能会收到以下错误:
我如何确保roxygenize()
知道读取文件的顺序,即应该先读取哪个类定义?
注意:我知道我回答了我自己的问题。那是因为我经常遇到这个问题,并且在查看roxygen2
. 因此,作为参考,这是我的发现。
r - 为 S4 引用类的实例定义默认字段值
如何定义S4 引用类实例的字段默认值?
对于常规 S4 课程,有以下prototype
论点:
据我了解的帮助页面,这也应该适用于通过参数setRefClass
的 S4 参考类。...
相应的部分说:
...要传递给 setClass 的其他参数。
然而prototype
似乎没有setClass
正确发送到:
或者
我没有在setRefClass
.
这是一个错误还是我在这里遗漏了一些明显的东西?
编辑
我能找到的最接近的可以帮助我声明默认值的是$initFields()
.
这就是?setRefClass
不得不说的:
从提供的参数初始化对象的字段。此方法通常仅从具有 $initialize() 方法的类调用。它对应于引用类的默认初始化。如果有插槽和非引用超类,这些也可以在 ... 参数中提供。
通常,一个专门的 $initialize() 方法执行它自己的计算,然后调用 $initFields() 来执行标准初始化,如下面示例中的 matrixViewer 类所示。
到现在为止还挺好
适用于“默认初始化案例”:
但是,如果无法处理在初始化时明确指定(某些)字段值的情况:
解决方法
真的很脏,但它的工作原理
初始化
这就是我正在寻找的东西,但我确定还有更多“内置”的东西?
编辑 2
整个事情有点通用。方法ensureDefaultValues
可以是每个其他类继承自的类的方法。对于“继承路径更远”的类,可以简单地在方法内调用此intialize
方法:
r - S4 中的替换()
如果仅在方法中定义了 S4 泛型函数的命名参数,则按substitute()
预期工作:
但是,如果向方法的定义添加一个额外的命名参数,substitute()
则在传递参数时停止正确返回参数:
关于为什么会发生这种情况以及最重要的是如何解决它的任何线索?