【问题标题】:Evaluate listed strings to create function object in r评估列出的字符串以在 r 中创建函数对象
【发布时间】:2017-08-17 11:16:03
【问题描述】:

我需要一个由命令列表创建的函数来完全评估,以便它与函数的“手动”版本相同。

背景:我在 Microsoft R Server 中使用 ScaleR 函数,需要将一组转换作为函数应用。 ScaleR 对需要传递一个确切措辞的函数非常挑剔,如下所示:

functionThatWorks <- function(data) { 
  data$marital_status_p1_ismarried <- impute(data$marital_status_p1_ismarried)
  return(data)
}

我有一个函数可以创建这个转换列表(还有数百个,因此需要对其编写进行功能化)。

transformList <- list ("data$ismarried <- impute(data$ismarried)",
                 "data$issingle <- impute(data$issingle)")

此行将我想要的评估字符串输出到控制台,但我不知道如何将其从控制台输出移动到函数中使用:

cat(noquote(unlist(bquote(  .(noquote(transformList[1]))))))

我需要评估 functionIWant 使其与 functionThatWorks 相同。

functionIWant <- function(data){
  eval(  cat(noquote(unlist(bquote(  .(noquote(transformList[1])))))) )
  return(data)
}

identical(functionThatWorks, functionIWant)

编辑:根据@dww 的代码添加答案。它在 ScaleR 中运行良好。它是相同的,减去无意义的间距。

functionIWant <- function(){}
formals(functionIWant) <- alist(data=NULL)
functionIWant.text <- parse(text = c(
  paste( bquote(  .(noquote(transformList[1]))), ";", "return(data)\n")
))
body(functionIWant) <- as.call(c(as.name("{"), functionIWant.text))

【问题讨论】:

  • 也许可以试试 eval(parse(text=...)) 或 eval(substitute(...))
  • 谢谢,但我使用 eval()、parse()、bquote()、unlist() 和 noquote() 围绕这段代码做了很多工作,但都没有成功。没有尝试的组合会创建与“手动”条目相同的功能对象。函数对象只包含输入的代码,而不是该代码应该计算的内容。

标签: r function evaluate


【解决方案1】:

也许是这样的?

# 1st define a 'hard-coded' function    
f1 <- function (x = 2) 
{
    y <- x + 1
    y^2
}

f1(3)
# [1] 16

# now create  a similar function from a character vector  
f2 <- function(){}
formals(f2) <- alist(x=2)
f2.text <- parse(text = c('y <- x + 1', 'y^2'))
body(f2) <- as.call(c(as.name("{"), f2.text))

f2(3)
# [1] 16

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2021-05-22
    • 2016-08-27
    • 2021-02-09
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多