2016-05-23 48 views
2

私は、Rの省略記号(...)引数を使用して賢明に作業しようとしており、いくつか問題があります。Rに省略記号の引数ベクトルを認識させるにはどうすればいいですか?

...を使用して関数の引数領域を乱雑にすることなく、関数の先頭にいくつかのデフォルト引数を渡そうとしています。しかし、何とか省略記号引数が

test <- function(dat, 
       # I don't want to have to put default col, 
       # ylim, ylab, lty arguments etc. here 
       ...) { 
    # but here, to be overruled if hasArg finds it 
    color <- "red" 
    if(hasArg(col)) { # tried it with both "col" and col 
    message(paste("I have col:", col)) 
    color <- col 
    } 
    plot(dat, col = color) 
} 

関数呼び出し私の完全なベクトルをピックアップしていないようだ。

test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue")) 

をエラーを例外:

Error in paste("I have col:", col) (from #8) : 
    cannot coerce type 'closure' to vector of type 'character' 

だから、何かが間違ってここに起こっています。私が省略記号の引数をプロット関数に渡すと、エラーなしですぐに動作します。

+1

[いくつかのAdvanced R](http://adv-r.had.co.nz/Computing-on-the-language.html)を読んでいる必要があるようなサウンドです。私がリンクしたページで 'dots'を検索してください。 – Gregor

答えて

4

あなたが関数の内部で、その内容を使用する場合は、リストに...梱包/ 収集することで、これを実行する必要があります。

test <- function(dat, 
       # I don't want to have to put default col, 
       # ylim, ylab, lty arguments etc. here 
       ...) { 
    opt <- list(...) 
    color <- "red" 
    if(!is.null(opt$col)) { # tried it with both "col" and col 
    message(paste("I have col:", opt$col)) 
    color <- opt$col 
    } 
    plot(dat, col = color) 
} 

test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue")) 

元のコードに問題は、args()またはhasArg()のみ関数呼び出しの仮引数のために働くということです。したがって、col = c("purple", "green", "blue")を渡した場合、hasArg()には正式な引数colがありますが、はそれを評価しませんです。したがって、関数内に実際のcol変数はありません(これを確認するにはデバッガを使用できます)。興味深いことに、R baseパッケージの関数col()があるので、この関数はpasteに渡されます。結果として、文字列と "クロージャー"を連結しようとするとエラーメッセージが表示されます。

関連する問題