2014-10-05 95 views
1

在R中定义新的参考类时,会出现一堆锅炉板方法(按R约定),如lengthshow等当这些被定义的时候,它们在类的方法中调用时会大量地掩盖类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用package::说明符。在相同名称的参考类方法中使用方法/函数

有没有办法告诉一个方法忽略它自己的方法,除非调用明确使用.self $?

实施例:

tC <- setRefClass(
    'testClass', 
    fields = list(data='list'), 
    methods = list(
    length=function() { 
     length(data) 
    } 
) 
) 

example <- tC(data=list(a=1, b=2, c=3)) 
example$length() # Will cause error as length is defined without arguments 

可选地一个可以诉诸限定S4方法的类,而不是(如参考类引擎盖下S4类),但是这似乎是工作与参考类想法.. 。

编辑: 为了避免集中在情况下,您预先知道的数据类考虑这个例子:

tC <- setRefClass(
    'testClass', 
    fields = list(data='list'), 
    methods = list(
    length=function() { 
     length(data) 
    }, 
    combineLengths = function(otherObject) { 
     .self.length() + length(otherObject) 
    } 
) 
) 

example <- tC(data=list(a=1, b=2, c=3)) 
example$combineLength(rep(1, 3)) # Will cause error as length is defined without arguments 

我知道有可能将自己的调度写入正确的方法/函数,但这似乎是这样一种常见情况,我认为它可能已经在方法包中解决了(usingMethods()的反向排序)

因此,我的问题是,如果以前不清楚,我很抱歉:是否有方法忽略方法定义中的引用类方法和字段,并完全依赖.self来访问它们,以便定义方法/函数课外不掩饰?

+1

在我看来,你总是知道外国功能的命名空间。你可以从帮助页面看到它。在你的例子中'base :: length(data)'就足以使它工作。 – nicola 2014-10-05 06:48:04

+0

在知道输入是列表的情况下,是的。但想象一下用户提供数据的情况,即长度不在其中一个字段上调用,因此您不知道传入的内容。您可能允许一种方法接受在不同包中定义的几个不同对象。为了使用'::',你需要检查对象并进行手动调度 - R通常会为你做。 – ThomasP85 2014-10-05 07:10:55

+0

@ ThomasP85你的例子并不清楚,你最后的评论也是。你正在使用类来明确地设置数据的类型(在这里是一个列表),所以你怎么能不知道它的类型? – agstudy 2014-10-05 07:16:01

回答

0

这个例子不是很清楚。我不知道你有什么理由不知道你的方法的命名空间。无论如何,在这里一对夫妇的方法来解决此问题:

  1. 您可以参考类方法Length使用不同的名称与资本“L”,例如
  2. 你可以找到通用的动态命名空间功能。

例如:

methods = list(
    .show =function(data) { 
     ns = sub(".*:","",getAnywhere("show")$where[1]) 
     func = get("show",envir = getNamespace(ns)) 
     func(data) 
    }, 
    show=function() { 
     .show(data) 
    } 
) 
  • 可以使用新的参考类系统R6
  • 例如:

    tC6 <- R6Class('testClass', 
        public = list(
        data=NA, 
        initialize = function(data) { 
         if (!missing(data)) self$data <- data 
        }, 
        show=function() show(self$data) 
    ) 
    ) 
    
    相关问题