我正在尝试使用一个名为“ causaldrf”的R库的一些功能。假设,在库中,我们有一个函数“ func(a,b)”,该函数接受字符串“ a”,并在数据帧“ b”中调用名为“ a”的列。
该函数的实现如下(简化):
func(a,b){
tempcall <- match.call()
Operation then performed on tempcall, for example:
my_string <- tempcall$a
}
结果,match.call()函数不evaluate“ a”和“ b”的值,而是将它们作为names。我发现这很烦人,因为当我编写一个for循环从列表中读取“ a”的值并在for循环内调用函数“ func”时,“ a”的值未在“ func”中使用,而是,tempcall包括未评估名称。这使得for循环不可用。
我想知道,有什么方法可以使match.call()求值,而不只是传递名称?
一种解决方案是为func()写一个包装,在其中我首先创建一个字符串func()及其参数,例如“ func(a,b)”,然后通过parse(“ func(a, b)“),然后通过eval(parse(” func(a,b)“))对其求值。这样,我可以评估字符串和整数的值,但是数据帧“ b”作为列表传递,将其弄乱了。我尝试通过as.dataframe(b)及其不同类型将数据帧作为数据帧传递,但没有任何效果。
然后,我在“ func”中的库中使用了parse(),deparse()和eval()来评估match.call(),但没有一个起作用。
任何想法都将不胜感激。
P.S。开发人员,请不要使用match.call()来检查您的输入,否则会妨碍自动化。
eval
允许函数使用其值。func <- function(a, b){
tempcall <- match.call()
a <- eval(tempcall[['a']])
b <- eval(tempcall[['b']])
a + b
}
func(pi, 2)
#[1] 5.141593