2017-08-17 69 views
1

函數對象,我需要通過命令的列表,以全面評估,以便它是相同的功能的「手動」版本中創建的功能。評估上市字符串創建中的R

背景:我使用的潔牙機的功能在微軟R服務器,需要將一組變換的功能。潔牙機約需要傳遞以下爲指定了一個措辭準確一個功能非常挑剔:

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)) 
+0

也許嘗試一些的eval(解析(文= ...))或EVAL(替代(...)) –

+0

謝謝,但我已經使用eval做了很多舞蹈的解決這個代碼() parse(),bquote(),unlist()和noquote()並沒有成功。沒有嘗試組合創建與「手動」條目相同的功能對象。函數對象僅包含輸入的代碼,而不包含代碼應該計算的內容。 – nb01

回答

0

也許是這樣的?

# 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