我想在for循环中创建评估不同的索引。 这些索引具有不同的公式,并非总是需要对其进行评估。 f.i. : 我要评估的指数可能是
a=1
b=2
c=5
d=8
IDX1=function(a,b) {result=a+b}
IDX2=function(c,b) {result=c+b}
IDX3=function(d,b) {result=d+b-c}
IDX4=function(a,d) {result=a+d+b+c}
公式并不重要
在一个数据帧中,我具有迭代次数和每个循环需要获取的索引(假设我必须为每个迭代评估2个索引)
head=c("iter","IndexA","IndexB")
r1=c(1,"IDX1","IDX2")
r2=c(2,"IDX3","IDX4")
r3=c(3,"IDX1","IDX4")
df=as.data.frame(rbind(head,r1,r2,r3))
我想做的是在循环中为每次迭代评估各自的2个索引,并自动调用正确的公式广告并为其提供正确的参数
iter 1 : IndexA=IDX1(args)=3 ; IndexB(args)=IDX2(args)=7
iter 2 : IndexA=IDX3(args)=5 ; IndexB(args)=IDX4(args)=16
iter 3 : IndexA=IDX1(args)=3 ; IndexB(args)=IDX4(args)=16
请不要回答“只需运行所有功能并调出 循环中需要的结果。”
我正在处理大型矩阵,而内存确实是一个问题。我需要在循环中评估函数以减少内存使用量
我相信答案是这次讨论中的一些内容,但我无法理解。
How to create an R function programmatically?
有人可以解释我吗 1.如何构建可以循环编程更改的功能? 2.一旦有了它,如何运行公式并获得所需的结果? 谢谢
答案 0 :(得分:1)
您可以使用eval
和parse
函数的组合来调用(评估)任何字符串作为代码。首先,您必须构造这样的字符串。为此,您可以将索引指定为字符串。例如:IDX1 = "a + b"
。然后,您可以使用get("IDX1")
按名称获取该值。
尝试以下代码:
# Your preparations
a <- 1
b <- 2
c <- 5
d <- 8
IDX1 <- "a + b"
IDX2 <- "c + b"
IDX3 <- "d + b - c"
IDX4 <- "a + d + b + c"
head = c("iter", "IndexA", "IndexB")
r1 = c(1, "IDX1", "IDX2")
r2 = c(2, "IDX3", "IDX4")
r3 = c(3, "IDX1", "IDX4")
df = as.data.frame(rbind(r1, r2, r3))
colnames(df) <- head
# Loop over df with apply
result <- apply(df, 1, function(x){
# Construct call string for further evaluation
IndexA_call <- paste("ia <- ", get(x[2]), sep = "")
IndexB_call <- paste("ib <- ", get(x[3]), sep = "")
# eval each call string
eval(parse(text = IndexA_call))
eval(parse(text = IndexB_call))
x[2:3] <- c(ia, ib)
return(as.numeric(x))
})
result <- t(result)
colnames(result) <- head
print(result)
这给出了:
iter IndexA IndexB
r1 1 3 7
r2 2 5 16
r3 3 3 16