我决定给参考课另一个镜头,但我的第一个问候世界已经给了我一些问题.这里出了什么问题?
> memory <- setRefClass(
+ Class = "memory",
+ fields = list(state="vector"),
+ methods = list(
+ get = function() { return(state) },
+ set = function(x) { state <<- x }
+ )
+ )$new()
> memory$set(123)
> print(memory)
Reference class object of class "memory"
Field "state":
[1] 123
> memory$get()
[1] 123
> print(memory)
Reference class object of class "memory"
Field "state":
Error in methods::show(field(fi)) :
error in evaluating the argument 'object' in selecting a method for …Run Code Online (Sandbox Code Playgroud) 我正在阅读Martin Morgan关于参考类的注释,在幻灯片7中,他使用setMethod来定义show函数而不将其先前设置为通用类setGeneric.
为什么允许这样做?是否存在所有引用类声明为通用的方法列表,包括show?
就像一个测试:
myclass = setRefClass("myclass",
fields = list(
x = "numeric",
y = "numeric"
))
myclass$methods(
dfunc = function(i) {
message("In dfunc, I save x and y...")
obj = .self
base::save(obj, file="/tmp/obj.rda")
}
)
myclass$methods(
print = function() {
if (.self$x > 10) {
stop("x is too large!")
}
message(paste("x: ", .self$x))
message(paste("y: ", .self$y))
}
)
myclass$methods(
initialize = function(x=NULL, y=NULL, obj=NULL) {
if(is.null(obj)) {
.self$x = x
.self$y = y
}
else {
.self$x = obj$x
.self$y = obj$y …Run Code Online (Sandbox Code Playgroud) 我正在创建一个R包。该包定义了几个参考类。这些类之间存在依赖关系,因为一个是基类,其他是子类。由于这种依赖性,必须按一定顺序加载程序包文件:首先加载基类,然后再加载子类。但是,仅凭运气,R首先加载了子类,并抱怨未定义基类。
如何强制以特定顺序执行程序包的源文件?
我当前的“解决方案”是将所有类定义放入一个源文件中,首先定义基类。谈丑。有更好的方法。
我有:
MyClass < - setRefClass("MyClass",fields = list(data ="numeric"))
让我们初始化一个对象MyClass:
OBJ < - MyClass(数据= 1:4)
...并在屏幕上打印:
OBJ
Reference class object of class "MyClass"
Field "data":
[1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
我想改变它的打印方式,所以我写了这个方法:
print.MyClass < - function(x){cat("This is printed representation:")print(x $ data)}
现在这个工作:
打印(OBJ)
This is printed representation: [1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
这不是:
OBJ
有没有办法只用键入来实现我的打印方法OBJ?
我也尝试过show,或者(OBJ),但是对我没有爱.
我想[.为我写一个方法ReferenceClass.到目前为止,我有这样的事情:
DT <- data.table(Index=1:5)
MySeries <- setRefClass("MySeries", fields = list(data="data.table"))
setMethod("[","MySeries",function(x, i,j,drop) {
ii <- substitute(i)
x$data <- x$data[eval(ii)]
return(x)
})
S <- MySeries(data=DT)
Run Code Online (Sandbox Code Playgroud)
...但是当我最后打电话时它会抛出一个错误S[Index>3].如何解决上述问题以获得此预期结果?
Index
4: 4
5: 5
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用roxygen2为引用类对象创建文档,但是当我运行R CMD检查时,我不断收到此警告:
S4 class codoc mismatches from documentation object 'myRefClass-class':
Slots for class 'myRefClass'
Code: .xData
Inherited: .xData
Docs: field1 field2
Run Code Online (Sandbox Code Playgroud)
这是与上述警告相关的ref class和roxygen2块:
#' @title myRefClass class
#' @description Description of myRefClass
#' @import methods
#' @exportClass myRefClass
#' @slot field1 A character slot
#' @slot field2 A numeric slot
myRefClass<-setRefClass(Class="myRefClass",
fields=list(field1="character",
field2="numeric"))
Run Code Online (Sandbox Code Playgroud)
以下是生成的R文档:
myRefClass-class {testPackaging} R文档myRefClass类
描述
myRefClass的描述
老虎机
field1字符槽
field2数字槽
至于我能找到的文档,codoc正在测试我的代码和文档之间的一致性.据我所知,所有的插槽名称都是一样的; 也许我错过了什么.不确定文档是否应该自动将其标记为引用类,或者我是否应该以某种方式指出?我发现R文档表明插槽".xData用于启用异常类型的继承",但我不确定为什么它适用于我在这里做的或者我应该用它做什么.
我已经尝试了一些roxygen标签的排列并且保持接近这里发现的结构似乎给了我最好的结果/来自R CMD检查的最少警告:Roxygen2 - 如何@export参考类生成器? 我一直在网上寻找roxygen2应该如何与参考类一起使用的例子; 也许我正在寻找错误的地方 - 我运气不好.
我正在使用roxygen2 v 3.1.0/RStudio版本0.98.501/R版本3.0.3/OSX 10.9.2(注意:尝试升级到roxygen2 v 4.0并且它在引用类上完全被阻塞,以至于没有文档存在根本生成)
如果有人知道使用roxygen2和引用类的CRAN包,那么我可能会看到它是如何正确完成的,或者如果有人知道我做错了什么,那么帮助将非常感激.我是R的包装建筑的新手.
例如:
Mycls = setRefClass(
"Mycls",
fields = list(
# this is just a mock up
colorvec = "numeric" | "factor" | "matrix"
)
)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想允许colorvec数字或因子或矩阵.有没有办法做到这一点?
我想将引用类传递给引用类构造函数,并将传递的引用类指定为字段.但是,当我运行下面的代码时,我不明白为什么会出现错误.我的问题是:
1)请有人可以解释为什么会发生这种错误:
> a <- ClassA&new()
Error in .getClassFromCache(Class, where) :
argument "Class" is missing, with no default
> b <- ClassB$new(a)
Error in .Object$initialize(...) : object 'a' not found
Run Code Online (Sandbox Code Playgroud)
2)我已将class.a.container声明为类"list",但我希望这是一个引用类.我需要放在这里而不是"列表"?
ClassA <- setRefClass(
"ClassA",
fields = list(myVar = "numeric"),
methods = list(
someMethod = function(){
print("hi")
}
)
)
ClassB <- setRefClass(
"ClassB",
fields = list(class.a.container = "list"),
methods = list(
initialize = function(class.a){
class.a.container <<- class.a
})
)
a <- ClassA&new()
b <- ClassB$new(a)
Run Code Online (Sandbox Code Playgroud)