1

我正在尝试在 R6Class 中获取函数的formals()。但这似乎不起作用。我认为环境可能存在问题。

Test <- R6Class(
  "Test",

  public = list(
    foo = function(x){
      x
    }, 

    printFormals1 = function(){
      formals("foo")
    }, 

    printFormals2 = function(){
      formals("self$foo")
    }
  )
)

test <- Test$new()
test$printFormals1()
test$printFormals2()

错误说:

Error in get(fun, mode = "function", envir = parent.frame()) : 
  object 'foo' of mode 'function' was not found

Error in get(fun, mode = "function", envir = parent.frame()) : 
  object 'self$foo' of mode 'function' was not found

如果没有 R6Classes,这很容易:

foo <- function(x){
  x
}

formals("foo")

结果:

$x

很高兴有人可以解释和帮助

谢谢迈克尔

编辑:

找到了解决方案。与 R6class 无关: eval(parse(text = "self$foo")) 完成了这项工作。我会留下这个问题,以防其他人面临类似的问题。

Test <- R6Class(
  "Test",

  public = list(
    foo = function(x){
      x
    }, 

    printFormals2 = function(){
      print(formals(eval(parse(text = "self$foo"))))
    }
  )
)

test <- Test$new()

test$printFormals2()
4

1 回答 1

2

深入了解formals您会发现,当您传递一些字符而不是函数的内容时,它具有非常具体的搜索参数。

你可以只传递函数[避免eval(parse(text=...))丑陋]

Test <- R6Class(
  "Test",

  public = list(
    foo = function(x){
      x
    }, 

    printFormals2 = function(){
     formals(self$foo)
    }
  )
)

test <- Test$new()

test$printFormals2()
# $x
于 2015-08-04T04:16:24.890 回答