2016-03-24 13 views
0

を参照して、1を書くことができます:私はと呼ばれる関数を書いたR言語の関数の引数は、線形モデル関数では、データファイル

result <- lm(r ~ N, data = ds) 

関数は、変数rのためにデータフレームDSで見て知っていて、N

Check.Data。引数riとniはデータファイルdsの変数です。それがR見つけることができないので、

Check.Data(ri = ds$r, ni = ds$N, data = ds) #This runs 
Check.Data(ri = r, ni = N, data = ds) #this does not 

関数の2番目の呼び出しは実行されません:Check.Dataで エラー(RI = R、NI = N、データ= DS):オブジェクトは 'r' が見つかりません

riとniの引数がデータセット(例:ri = ds $ r、ni = ds $ N)を指定することなくdsの変数であることが分かるように、関数内ではどのようなコマンドが必要ですか?

あなたが機能を見たい場合は、ここにある:

Check.Data <- function(ri= ri, ni=ni, data = data) 
    { 

    #make sure values needed are non-missing 
    if (missing(data)) stop("Function CheckData is terminated because data set name is missing.") 

    if (missing(ri)) stop("Function CheckData is terminated because ri is missing.") 

    if (missing(ni)) stop("Function CheckData is terminated because ni is missing.") 

    #add ri and ni to the data frame named data 
    data$ri <- ri 
    data$ni <- ni 

    #make sure ri is numeric 
    if(is.numeric(data$ri) == FALSE) stop("Function CheckData is terminated because ri is not numeric.") 

    #make sure ni is numeric 
    if(is.numeric(data$ni) == FALSE) stop("Function CheckData is terminated because ni is not integer.") 


    #does ri have any missing data. if so issue message and stop 
    if(any(ind.na <- is.na(data$ri))) stop(paste("ri has", sum(ind.na), "missing values. CheckData is terminated.")) 

    #does ni have any missing data. if so issue message and stop 
    if(any(ind.na <- is.na(data$ni))) stop(paste("ni has", sum(ind.na), "missing values. CheckData is terminated.")) 

} 
+2

「特定のコマンド」で列の値にアクセスするために使用することができます。あなたが記述しているテクニックは非標準評価と呼ばれています。[this](http://adv-r.had.co.nz/Computing-on-the-language.html)は良い紹介です。しかし、ri = "r"の代わりにri = rを指定できるという利点が、非標準評価を実装するのが難しく複雑になるかどうかを慎重に検討します。 – joran

+0

Ew、関数内で '$'を使うことは絶対にお勧めしません。これは、コンソールレベルで使用するための便利な機能です。代わりに '[['を使用する方法を学んでください。 –

答えて

2

R機能は、一般的に、彼らが呼ばれる環境の中で仮引数を評価しようとします。オブジェクトの列はRのファーストクラスのオブジェクトではないため、呼出環境にベクトルrNというベクトル(または他のデータオブジェクト)がない限り、特別な努力をしなければ2番目の呼び出しは失敗します。あなたは関数が代わりにdataの環境内のシンボルとしていくつかの引数を評価することを望んでいます。ジョランが指摘しているように、これはNSE(非標準評価)と呼ばれています。それを行う一般的に使用される関数の1つは、libraryまたはその近いいとこrequireです。 requireの最初の操作は、シンボル文字列の文字値への変換であることがわかります。次に、それを安全に使用すると、これらの変数を行う上で計画して正確に何に依存します[ -function

myNSEfun <- function(ri = r, ni = N, data = ds){ 
       ri.col <- as.character(substitute(ri.col)) 
       ni.col <- as.character(substitute(ni.col)) 
       print(summary(data[ c(ri.col, ni.col) ])) } 
関連する問題