在R中提取函数参数值的奇怪行为

时间:2017-01-21 22:35:29

标签: r evaluation

如何在列表中提取所有函数参数值?

我试过了:

x <- 1; y <- 2; z <- 3
testFunc <- function(a, b, c){
  args <- as.list(sys.call())[-1]
  evaluatedArgs <- lapply(args, function(x) eval(x))
  evaluatedArgs
}
str(testFunc(x,y,z))
  

3的清单   $:符号x
  $:num 2
  $:num 3

正如您所看到的,如果x内的function(x)和外部变量x之间存在奇怪的冲突,则会阻止对第一个参数的评估。

如何解决这场冲突?对我来说,这是一个奇怪的范围组合。

更新
现在我知道lapply(args, function(x) eval(x))解决了问题,但我想了解冲突的原因。

1 个答案:

答案 0 :(得分:2)

您的 // a group containing a digit and the literal character "." at least once const regex = /([\d.]+)/g // your string const haystack = `io=9839.1MB, bw=4012.3KB/s, iops=250, runt=2511369msec` console.log(haystack.match(regex))变量是&#34;列表&#34; of&#34; symbol&#34; s并作为参数传递给您的匿名args函数。因此,隔离问题,您基本上就是这样做:

lapply

x = 10; y = 20 (function(x) eval(x))(substitute(x)) #x (function(x) eval(x))(substitute(y)) #[1] 20 在其eval中评估其参数,这里是上述函数的parent.frame。该环境包含函数的参数和传递的值:

environment()

在第一种情况下,(function(x) as.list(environment()))(substitute(x)) #$x #x # (function(x) as.list(environment()))(substitute(y)) #$x #y 需要评估参数&#34; x&#34;转换为评估符号&#34; x&#34;。要评估符号&#34; x&#34;,它首先需要找到它,并且它在自己的环境中找到它,因为它是它的参数。 &#34; x&#34;找到的包含符号&#34; x&#34;那是归还的。在第二种情况下,评估参数&#34; x&#34;转换为评估符号&#34; y&#34;,它不在其环境中,但在其父环境中找到,其中包含值&#34; 20&#34;那是归还的。

具体而言,我们需要将评估环境传递给eval

eval

这里,参数被评估到函数当前环境的父环境(即 - 在这种情况下 - (function(x) { e = environment(); eval(x, parent.env(e)) })(substitute(x)) #[1] 10 (function(x) { e = environment(); eval(x, parent.env(e)) })(substitute(y)) #[1] 20 )。因此,修改您的功能以正确搜索:

.GlobalEnv

我们得到:

x = 1; y = 2; z = 3
testFunc = function(a, b, c)
{
    args = as.list(sys.call())[-1]
    e = environment()
    lapply(args, function(x) eval(x, e))
}