将字符串转换为对象-转换为实际文本,未经评估

时间:2019-03-12 01:41:53

标签: r

不要以为这是重复的,因为我想要的是未评估的实际代码/文本。

我正在构建一个函数,该函数要求输入如下所示:

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”,要求您以某种形式输入成本函数,我认为,我是这个程序包的新手。

1 个答案:

答案 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