【问题标题】:Capture and evaluate function arguments within function body在函数体内捕获和评估函数参数
【发布时间】:2020-04-14 07:07:27
【问题描述】:

我想在函数体中捕获函数的参数以帮助进行日志记录。我发现 match.call()sys.call() 在函数调用中明确说明参数值时有效,但在使用对象名称时不输出评估值。

这是一个简化的例子:

gauss_vector <- function(number) {
  sys_args <- as.list(sys.call())
  match_args <- as.list(match.call())
  output <- rnorm(n = number)
  list(sys_args,
       match_args,
       output)
}

当这个函数被这样调用时:

gauss_vector(number = 5)

结果列表包括值5

[[1]]
[[1]][[1]]
gauss_vector

[[1]]$number
[1] 5


[[2]]
[[2]][[1]]
gauss_vector

[[2]]$number
[1] 5


[[3]]
[1]  0.9663434  0.8051087  0.1576298  0.3189806 -2.3110680

但是,当这样调用函数时:

n <- 5
gauss_vector(number = n)

结果列表仅包括n

[[1]]
[[1]][[1]]
gauss_vector

[[1]]$number
n


[[2]]
[[2]][[1]]
gauss_vector

[[2]]$number
n


[[3]]
[1] -0.6017670 -0.7631405  0.7793892 -0.7529637  1.3022802

当以第二种方式调用函数时,有没有办法捕获评估的图形而不是对象名称?

【问题讨论】:

  • 我认为你需要evaleval.parent 某处。

标签: r function


【解决方案1】:

你可以eval 传递给函数的所有参数。

gauss_vector <- function(number) {

   sys_args <- as.list(sys.call())
   sys_args[-1] <- lapply(sys_args[-1], eval)
   match_args <- as.list(match.call())
   match_args[-1] <- lapply(match_args[-1], eval)
   output <- rnorm(n = number)
   list(sys_args,match_args,output)
}

gauss_vector(n)
#[[1]]
#[[1]][[1]]
#gauss_vector

#[[1]][[2]]
#[1] 5


#[[2]]
#[[2]][[1]]
#gauss_vector

#[[2]]$number
#[1] 5


#[[3]]
#[1]  0.6998265  0.4037748  1.8558809 -0.1343624 -1.5600925

【讨论】:

  • @Ronak_Shah - 太好了。有没有办法保留列表名称,以便更轻松地引用每个特定参数?
  • 如果您将其作为命名参数传递,它将返回预期结果,即gauss_vector(number = n)
  • 我认为@JayAchar 希望函数的最后一行是:list(sys_args=sys_args, match_args=match_args, output=output)
  • 我想按名称而不是位置访问 eval(argument),以防用户以不同的顺序输入参数。显然与这个简化的例子无关。谢谢两位 - 会接受。
猜你喜欢
  • 2018-11-05
  • 2015-07-17
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2014-09-14
相关资源
最近更新 更多