评估列出的字符串以在 r 中创建函数对象
Evaluate listed strings to create function object in r
我需要一个由命令列表创建的函数来完全评估,以便它与函数的 "manual" 版本相同。
背景:我在 Microsoft R Server 中使用 ScaleR 函数,需要应用一组转换作为函数。 ScaleR 非常挑剔需要传递一个措辞 exactly 的函数,如下所述:
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))
也许是这样的?
# 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
我需要一个由命令列表创建的函数来完全评估,以便它与函数的 "manual" 版本相同。
背景:我在 Microsoft R Server 中使用 ScaleR 函数,需要应用一组转换作为函数。 ScaleR 非常挑剔需要传递一个措辞 exactly 的函数,如下所述:
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))
也许是这样的?
# 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