我想知道在R5引用类中定义类方法和类变量的正确方法.
这是一个例子:
> # define R5 class XX
> # member variable: ma
> # member method: mfa
> XX <- setRefClass("XX",
+ fields = list(ma = "character"),
+ methods = list(
+ mfa = function() return(paste(ma, "*"))
+ ))
>
> XX
Generator object for class "XX":
Class fields:
Name: ma
Class: character
Class Methods:
"callSuper", "copy", "export", "field", "getClass", "getRefClass", "import", "initFields",
"mfa"
Reference Superclasses:
"envRefClass"
> # create an instance of XX
> x <- XX$new(ma="ma")
> …Run Code Online (Sandbox Code Playgroud) 我没有锁定其中一个字段时可以复制R5引用类,但如果其中一个字段被锁定则不会复制.示例代码如下(锁定调用已注释掉).我的问题:为什么我不能使用copy()方法复制带有锁定字段的实例?
example <- setRefClass('example',
fields = list(
count = 'numeric',
data = 'data.frame',
d.accessor = function(x) {
if ( !missing(x) )
data <<- x
else
.self$data
}
),
methods = list(
initialize = function( data ) {
if (!missing( data ))
d.accessor <<- data
count <<- 0
},
finalize = function()
print('Bye Bye'),
accumulate = function(x)
count <<- count + x
)
)
#example$lock('data') # write-1, read-many
instance <- example$new() # instantiation
df <- data.frame(x=1, y=2)# example df
instance$d.accessor <- …Run Code Online (Sandbox Code Playgroud) 是否有一种快速而肮脏的方法来测试实例是否来自引用类?
标准的R对象测试产生以下结果 - 但似乎没有任何东西专门标记引用类.
classy <- setRefClass('classy',
fields = list(
count = 'numeric'
),
methods = list(
initialize = function( data=NULL ) {
.self$data <<- data
}
)
)
instance <- classy$new() # instantiation
isS4(instance) # TRUE
mode(instance) # "S4"
typeof(instance) # "S4"
class(instance) # [1] "classy" attr(,"package") [1] ".GlobalEnv"
dput(instance) # new("classy", .xData = <environment>)
str(instance) #
# Reference class 'classy' [package ".GlobalEnv"] with 1 fields
# $ count: num(0)
# and 13 methods, of which 1 are possibly …Run Code Online (Sandbox Code Playgroud) 如何定义S4 Reference Classes实例的字段默认值?
对于常规S4类,有以下prototype论点:
setClass("Test_1",
representation(
x.1="numeric",
x.2="logical",
x.3="matrix"
),
prototype=list(
x.1=10,
x.2=FALSE,
x.3=matrix(0,0,0)
)
)
> new("Test_1")
An object of class "Test_1"
Slot "x.1":
[1] 10
Slot "x.2":
[1] FALSE
Slot "x.3":
<0 x 0 matrix>
Run Code Online (Sandbox Code Playgroud)
据我所知,帮助页面setRefClass,这也适用于S4参考类通过...参数.各节说:
...要传递给setClass的其他参数.
但prototype似乎没有setClass正确派遣:
gen <- setRefClass("Test_2",
fields=list(
x.1="numeric",
x.2="logical",
x.3="matrix"
),
prototype=list(
x.1=10,
x.2=FALSE,
x.3=matrix(0,0,0)
)
)
> gen$new()
Reference class object of class "Test_2"
Field "x.1":
numeric(0)
Field "x.2":
logical(0) …Run Code Online (Sandbox Code Playgroud) 我有一个关于参考类的问题.我的问题是在我正在开发rCharts的R包中.它使用引用类从R创建交互式图.
创建情节涉及一系列调用.这是一个示例,首先创建散点图,然后添加线图.
p1 <- rPlot(mpg ~ cyl, data = mtcars, type = 'point')
p1$layer(copy_layer = T, type = 'line')
Run Code Online (Sandbox Code Playgroud)
现在,由于引用类就像一个闭包,我想知道是否可以记录所做的调用.我的想法是,如果我可以记录所做的调用序列,那么我可以自动插入用于创建可视化的源代码以及html.
我试图看看我是否可以使用sys.function或match.call,但我没有得到任何地方.如果有人可以指出我如何处理这个问题,我将不胜感激.
我正在使用gWidgets在R中制作GUI.到目前为止,我一直在通过全球环境将值从一个窗口传递到另一个窗口.使用全局环境很容易实现,但并不理想.一个问题是R CMD check抱怨缺乏对全局变量的可见绑定.
作为这个问题的解决方案,几个R程序员已经提到了引用类.但是要理解引用类在这种情况下如何工作,有一个简单的例子真的很有帮助.
让我给一个愚蠢的GUI工作.当用户点击第一个窗口的按钮时,它将模型m放在全局环境中.第二个按钮m来自全局环境并提供输出.当您再次点击第一个按钮时,它将创建一个新模型m并更改第二个按钮的输出.如果关闭第一个窗口,第二个窗口中的按钮仍然可以工作,因为m它位于全局环境中.
library(gWidgets)
options(guiToolkit = "tcltk")
h1 <- function(h, ...){
d1 <- data.frame(x=runif(10), y=runif(10))
.GlobalEnv$m <- lm(x ~ y, data=d1)
}
g1 <- gbutton("1. Make model",
container=gwindow(), handler=h1)
h2 <- function(h, ...){
d2 <- data.frame(y=(1:10)/10)
p <- predict(.GlobalEnv$m, newdata=d2)
print(p)
}
g2 <- gbutton("2. Make prediction",
container=gwindow(), handler=h2)
Run Code Online (Sandbox Code Playgroud)
如何在此示例中使用引用类?
我想在另一个引用类中使用自定义引用类,但此代码失败:
nameClass <- setRefClass("nameClass", fields = list(first = "character",
last = "character"),
methods = list(
initialize = function(char){
chunks <- strsplit(char,"\\.")
first <<- chunks[[1]][1]
last <<- chunks[[1]][2]
},
show = function(){
cat("Special Name Class \n:")
cat("First Name:")
methods::show(first)
cat("Last Name:")
methods::show(last)
}
))
# this works fine
nameClass$new("tyler.durden")
Run Code Online (Sandbox Code Playgroud)
当我尝试添加具有类字段的第二个类时,nameClass无法启动此类.
personClass <- setRefClass("personClass", fields = list(fullname = "nameClass",
occupation = "character"),
methods = list(
initialize = function(Obj){
nm <- deparse(substitute(Obj))
fullname <<- nameClass$new(nm)
occupation <<- Obj
}))
Run Code Online (Sandbox Code Playgroud)
这只是回报:
Error …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能抑制R中的这些混乱控制台的输出:
Note: no visible binding for global variable '.->ConfigString'
Note: no visible binding for '<<-' assignment to 'ConfigString'
Run Code Online (Sandbox Code Playgroud)
这是代码(它是一个简单的ReferenceClass,用于存储R项目的配置):
# Reference Class to store configuration
Config <- setRefClass("Config",
fields = list(
ConfigString = "character"
),
methods = list(
# Constructor
initialize = function() {
ConfigString <<- "Hello, World!"
}
)
)
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的
我曾经尝试过组合和排列预定义变量,将它们预先设置为null等,但是R仍然顽固地在源代码中打印数百个“无可见绑定”注释。
在R的内部方面,有人比我聪明吗?
更新1
我尝试将更Config <-改为Config <<-,从而摆脱了第二个多余的音符。但是,第一个无关的音符仍然存在。
更新2
我开始感到沮丧,甚至约翰·钱伯斯(John Chambers)的示例代码也产生了更多这些可怕的无关紧要的笔记。
更新3
这些说明出现在Revolution R v7.0中,但没有出现在RStudio中。好像Revolution R v7.0正在调用R CMD check,通常仅在准备软件包时使用,因此可以安全地忽略这些注释。
更新4
难道R6类继承自(非正式S3)类的事实是否R6允许为该类的签名参数定义S4方法?
由于这是--AFAICT - 不是这样,什么是符合当前S3/S4标准的解决方法,或者在某些情况下可能被视为"最佳实践"?
参考类
请考虑以下示例,您希望在其中定义在超类上调度所有Reference类的实例继承自(envRefClass)的方法:
TestRefClass <- setRefClass("TestRefClass", fields= list(.x = "numeric"))
setGeneric("foo", signature = "x",
def = function(x) standardGeneric("foo")
)
setMethod("foo", c(x = "envRefClass"),
definition = function(x) {
"I'm the method for `envRefClass`"
})
> try(foo(x = TestRefClass$new()))
[1] "I'm the method for `envRefClass`"
Run Code Online (Sandbox Code Playgroud)
这种继承结构并不直接明显,因为class()不会揭示这一事实:
class(TestRefClass$new())
[1] "TestRefClass"
attr(,"package")
[1] ".GlobalEnv"
Run Code Online (Sandbox Code Playgroud)
但是,查看类生成器对象的属性会显示它:
> attributes(TestRefClass)
[... omitted ...]
Reference Superclasses:
"envRefClass"
[... omitted ...]
Run Code Online (Sandbox Code Playgroud)
这就是调度工作的原因
R6课程
当你想为R6类做类似的事情时,事情似乎并不是直截了当的,即使它们最初是这样的(与Reference …
引用类似乎只接受允许的基本/标准对象类型.例如,我想要一个chron对象,但这不允许我定义它:
> newclass <- setRefClass("newclass",fields=list(time="chron"))
Error in refClassInformation(Class, contains, fields, methods, where) :
class "chron" for field 'time' is not defined
Run Code Online (Sandbox Code Playgroud)
这是限制还是有更好的方法?我试过在initialize方法中设置它但显然这不是要么去的方法:
> newclass <- setRefClass("newclass",
+ fields=list(time="numeric"),
+ methods=list(initialize=function() time <<- as.chron(time)))
library(chron)
> x <- newclass(time=as.chron("2011-01-01"))
Error in .Object$initialize(...) : unused argument (time = 14975)
Run Code Online (Sandbox Code Playgroud) r ×10
reference-class ×10
s4 ×3
oop ×2
default ×1
gwidgets ×1
inheritance ×1
prototype ×1
r6 ×1