不要以为这是重复的,因为我想要的是未评估的实际代码/文本。
我正在构建一个函数,该函数要求输入如下所示:
compss[[1]](x[1],x[2])
compss是函数列表,我正在调用列表中的第一个函数,并使用参数x [1]和x [2]。
问题
我想构建一个一般情况,以便当我有两个以上变量时,我得到:
compss[[1]](x[1],x[2],x[3],.....)
(例如,我输入n = 5,我得到了上面的实际代码,但最多x [5])
我的方法失败
所以我最初的想法是首先创建一个带有n个“ x [i]'s”的向量
argss <- NULL
for (i in 1:length(variable.limits)){
argss <- c(argss, text = paste("x","[", i, "]", sep =""))
}
哪个给:
"x[1]" "x[2]" ....
然后我认为使用解析会有所帮助,但这给出了:
expression(x[1], x[2])
那没关系,我可以使用do.call等... 但是问题是我只想要那里的符号/对象/变量。原因是我将其运行到优化函数中,其中x [1]没有设置值,所以do.call似乎失败。有什么想法吗?
评论回复
r2evans回应评论,使用以下解决方案:
list_of_xs <- list(x[1], x[2], x[3])
do.call(compss[[1]], list_of_xs)
可能是解决此问题的最佳方法,所以现在剩下的唯一问题是如何归纳“ list_of_xs”。
我的用例是为非线性编程设计成本函数:
func <- function(x){
x[1]*x[2]*x[3] + (x[1]^2 - x[3]*x[2])
}
但是我正在尝试在我的框架中设计它,因此它适用于一般性问题,我们可能最多可以说x [100]。 我正在使用的程序包,即“ nloptr”,要求您以某种形式输入成本函数,我认为,我是这个程序包的新手。
答案 0 :(得分:3)
首先在txt
中创建字符表示形式,然后在其上使用parse
。在已解析的对象上使用[[1]]返回一个我认为是您想要的call
对象。
n <- 3
txt <- sprintf("compss[[1]](%s)", toString(paste0("x[", 1:n, "]")))
cobj <- parse(text = txt)[[1]]
cobj
## compss[[1]](x[1], x[2], x[3])
# check that we can evaluate cobj
compss <- list(function(a, b, c) a + b + c)
x <- 1:3
eval(cobj)
## [1] 6