2017-08-17 10 views
1

完全に評価するコマンドのリストによって作成された関数が必要であり、関数の「手動」バージョンと同じになる必要があります。リストされた文字列を評価して関数オブジェクトを作成する

背景:私はMicrosoft R Serverで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)) 
+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 
関連する問題