假设我有一个包含4个变量(A,B,C,D)的DB,有2行:
A B C D
1 1 2 3
1 1 4 5
我想做一个先验未知的数学运算,例如:
my_string <- "A x B - C x D"
在我的数据库中,前两个数字(A,B)是算法中的校准参数,C和D是数据。我需要做很多次告诉字符串的操作,以及未知的时间直到收敛。
由于我读过的内容,我认为这可以通过使用Call函数来完成。例如,我有一个功能:
my_function <- function(string, data){
#do what I have to do
return(something)
}
我应该重复my_function
,直到找到适合的A和B.
如果“指令”由字符串给出,我怎么能这样做?
PS:参数和数据显示在同一个数据框中,如果有助于更快地解决问题,它们可能位于两个不同的数据库中,我没有遇到任何麻烦。
答案 0 :(得分:2)
eval(parse(text="2+3"))
会产生5
,这就是你要找的东西吗?
它也适用于变量
d <- 4
eval(parse(text="d+3"))
将产生7
更新
这样的事情?
d <- data.frame(a = 11:20, b = 1:10)
f <- function(cmd, data) {
with(data, eval(parse(text=cmd)))
}
q <- f(cmd="2*a-3*b", d)
print(q)
产生
[1] 19 18 17 16 15 14 13 12 11 10
答案 1 :(得分:2)
更好的方法是使用eval(substitute()
而不是eval(parse(text = ...))
:
d <- data.frame(a = 11:20, b = 1:10)
f1 <- function(cmd,data){
eval(substitute(cmd),data,parent.frame())
}
> f1(a+b,d)
[1] 12 14 16 18 20 22 24 26 28 30
> f1(2*a-b,d)
[1] 21 22 23 24 25 26 27 28 29 30