如何在列表中提取所有函数参数值?
我试过了:
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))
解决了问题,但我想了解冲突的原因。
答案 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))
}