如何在R语言中多次评估函数参数传入的表达式?
R语言循环中重复执行表达式参数的问题
问题重现
我定义了一个接收表达式作为参数的函数,直接调用时能正常执行表达式:
myFUN <- function(x) eval(quote(x)) myFUN(x = { print(1 + 3) print(mean(mtcars$mpg)) })
输出符合预期:
[1] 4 [1] 20.09062
但把评估逻辑放进循环后,原本期望循环执行5次就重复评估5次表达式,结果却只执行了一次:
myFUN <- function(x){ for(i in 1:5){ eval(quote(x)) } } myFUN(x = { print(1 + 3) print(mean(mtcars$mpg)) })
实际输出:
[1] 4 [1] 20.09062
我期望的输出是重复5次执行结果:
[1] 4 [1] 20.09062 [1] 4 [1] 20.09062 [1] 4 [1] 20.09062 [1] 4 [1] 20.09062 [1] 4 [1] 20.09062
问题原因
quote(x)在这里只捕获了参数x的符号,而不是传入的代码块本身。第一次eval(quote(x))时,R会求值x,也就是执行传入的表达式并输出结果;后续循环中再执行eval(quote(x)),x已经被求值过,不会再重复执行原表达式,自然没有新的输出。
解决方案
用substitute()替代quote(),它能直接捕获传入的表达式内容,而不是参数符号。修改后的函数如下:
# 方式1:先捕获表达式再循环执行 myFUN <- function(x){ expr <- substitute(x) for(i in 1:5){ eval(expr) } } # 方式2:循环内直接捕获并执行 myFUN <- function(x){ for(i in 1:5){ eval(substitute(x)) } }
调用修改后的函数,就能得到期望的重复执行结果。
内容的提问来源于stack exchange,提问作者Wencheng Lau-Medrano
相关产品推荐
相关产品推荐

