标签: reference-class

在R5引用类中定义类方法和类变量

我想知道在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)

oop r reference-class

5
推荐指数
1
解决办法
1036
查看次数

使用锁定变量复制R5引用类

我没有锁定其中一个字段时可以复制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 reference-class

5
推荐指数
1
解决办法
228
查看次数

R测试参考类

是否有一种快速而肮脏的方法来测试实例是否来自引用类?

标准的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)

r reference-class

5
推荐指数
1
解决办法
322
查看次数

为S4 Reference Classes的实例定义默认字段值

如何定义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)

prototype default r s4 reference-class

5
推荐指数
1
解决办法
1693
查看次数

可以将参考类用于日志调用

我有一个关于参考类的问题.我的问题是在我正在开发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.functionmatch.call,但我没有得到任何地方.如果有人可以指出我如何处理这个问题,我将不胜感激.

r reference-class

5
推荐指数
1
解决办法
148
查看次数

使用R引用类在GUI中将值从一个窗口传递到另一个窗口

我正在使用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)

如何在此示例中使用引用类?

user-interface r global-variables gwidgets reference-class

5
推荐指数
1
解决办法
327
查看次数

R中包含自定义字段类的引用类?

我想在另一个引用类中使用自定义引用类,但此代码失败:

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)

oop r s4 reference-class

5
推荐指数
1
解决办法
754
查看次数

在R中,是否可以禁止显示“注:全局变量无可见绑定”?

我想知道是否有可能抑制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

Hadley Wickhams代码也会生成这些注释 …

r reference-class

5
推荐指数
1
解决办法
3903
查看次数

R6类的S4调度行为不一致

实际问题

  1. 难道R6类继承自(非正式S3)类的事实是否R6允许为该类的签名参数定义S4方法?

  2. 由于这是--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 …

inheritance r s4 reference-class r6

4
推荐指数
1
解决办法
264
查看次数

在Reference Class对象中定义非标准类

引用类似乎只接受允许的基本/标准对象类型.例如,我想要一个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 reference-class

3
推荐指数
1
解决办法
526
查看次数