不要认为这是重复的,因为我想要的是实际的代码/文本,而不是评估。
我正在构建一个函数,它要求输入如下所示:
compss[[1]](x[1],x[2])其中compss是一个函数列表,我正在调用列表中的第一个函数,并使用参数x1和x2。
问题
我想建立一个一般情况,当我有两个以上的变量时,我得到:
compss[[1]](x[1],x[2],x[3],.....)(如in所示,我输入n= 5,得到上面的实际代码,但不超过x5)
我失败的方法
所以我最初的想法是先用n个“xi”来创建一个向量,
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等.但问题是,我只想要符号/对象/变量在那里。原因是我将其运行到一个优化函数中,其中x1没有设置值,因此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])
}但是我试图在我的框架内设计它,所以它适用于一般的问题,在这里我们可以说是x100。我正在使用的包,即"nloptr",要求您以某种形式输入成本函数,我认为,我是这个包的新手。
发布于 2019-03-12 02:56:44
首先在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] 6https://stackoverflow.com/questions/55112879
复制相似问题