Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在同名的引用类方法中使用方法/函数_R_Oop_Dispatch_Reference Class - Fatal编程技术网

R 在同名的引用类方法中使用方法/函数

R 在同名的引用类方法中使用方法/函数,r,oop,dispatch,reference-class,R,Oop,Dispatch,Reference Class,在R中定义一个新的引用类时,有一堆锅炉板方法(按R约定),如length,show等。当这些方法被定义时,它们在类的方法中调用时会积极屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用包::说明符 有没有办法告诉一个方法忽略它自己的方法,除非使用.self$专门调用它 例如: tC <- setRefClass( 'testClass', fields = list(data='list'), methods = list( length=fun

在R中定义一个新的引用类时,有一堆锅炉板方法(按R约定),如
length
show
等。当这些方法被定义时,它们在类的方法中调用时会积极屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用
包::
说明符

有没有办法告诉一个方法忽略它自己的方法,除非使用.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

tC这个例子不是很清楚。我不知道为什么你不能知道你的方法的名称空间。不管怎样,这里有一些解决这个问题的方法:

  • 您可以为引用类方法
    Length
    使用不同的名称,例如大写字母“L”
  • 您可以动态地找到泛型函数的名称空间
  • 例如:

      methods = list(
        .show =function(data) {
          ns = sub(".*:","",getAnywhere("show")$where[1])
          func = get("show",envir = getNamespace(ns))
          func(data)
        },
        show=function() {
          .show(data)
        }
      )
    
    tC6 <- R6Class('testClass',
      public = list(
        data=NA,
        initialize = function(data) {
          if (!missing(data)) self$data <- data
        },
        show=function()   show(self$data)
      )
    )
    
  • 您可以使用新的引用类系统 例如:

      methods = list(
        .show =function(data) {
          ns = sub(".*:","",getAnywhere("show")$where[1])
          func = get("show",envir = getNamespace(ns))
          func(data)
        },
        show=function() {
          .show(data)
        }
      )
    
    tC6 <- R6Class('testClass',
      public = list(
        data=NA,
        initialize = function(data) {
          if (!missing(data)) self$data <- data
        },
        show=function()   show(self$data)
      )
    )
    

    tC6在我看来,您总是知道外部函数的名称空间。例如,您可以从帮助页面中看到它。在您的示例中,
    base::length(data)
    足以使其工作。如果您知道输入是一个列表,则可以。但是想象一下这样一种情况:用户提供数据,即其中一个字段上没有调用length,因此您不知道传入了什么。您可以允许一个方法接受在不同包中定义的几个不同对象。为了使用
    ::
    您需要检查对象并进行手动分派-这是R通常会为您做的。@ThomasP85您的示例不清楚,最后的注释也不清楚。您正在使用类显式地设置数据的类型(这里出现的是一个列表),所以您怎么能不设置它的类型呢?