2016-08-09 9 views
5

これらの関数のデフォルト値を指定せずに複数の引数を必要とする関数があります。しかし、それらのうちのいくつかが指定されていなくても、これらのパラメータが行列(そしておそらく他の型)のサブセットにしか使われないならば、関数は値を返します。なぜこれが当てはまるのか困惑しています - 誰でも助けることができますか?デフォルト以外の関数の値は無視されます

具体的には、なぜ次のコードがエラーを返さないが、マトリックス全体にわたって合計し、jを無視:

foo <- function(mat, j){ 
    v <- sum(mat[,j]) 
    v 
} 

foo(mat = matrix(1:4,3,4)) 

答えて

2

私の推測は評価されません。

foo <- function(x) 
    bar(x) 

bar <- function(y) 
    missing(y) 

foo() 
#[1] TRUE 
foo(43) 
#[1] FALSE 

内部関数は、引数jが欠落しているかどうかを仮引数i, j, ..., drop = FALSE、最も可能性の高い小切手を持っており、それが欠落している場合、それはそれを評価しようとしないあなたの場合[、インチ

+0

' R'が環境内の 'j'の値を見つけることができないとき、' j'が列(行)を示すはずであるということを無視しますか?これは常にオブジェクトのインデックスを作成する場合ですか? –

+2

いいえ、Rが 'j'を評価し、現在または親環境で' j'が見つからない場合、エラーが発生します。この場合、 'j'は評価されないのでエラーはありません。 Rの引数は、必要ならば関数環境で評価され、 'missing()'のような特殊関数は引数を全く評価しません。 –

4

this blogによれば、デフォルトなしのオプションの引数は、関数の内部から欠落しています。それをテストするとTRUEが返されます。

foo <- function(mat, j){ 
    v <- sum(mat[,j]); print(missing(j)) 
    v 
} 
foo(mat = matrix(1:4,3,4)) 
[1] TRUE 
[1] 30 

詳細は何であったかを知ることがなければ、私はsumビットで実験し、これは示してものです。

sum(matrix(1:4,3,4)[,NA]) 
[1] NA 
sum(matrix(1:4,3,4)[,NULL]) 
[1] 0 
sum(matrix(1:4,3,4)[,]) 
[1] 30 

マトリックスのインデックスを指定しない場合、sumはすべての値を合計します。

ブログと小さな実験を読んで、使用された関数がデータを提供し、欠落した引数で操作できる場合にカスタム関数が機能すると思います。行列をサブセット化する場合、サブセットの引数がない場合の動作は、関数がデータセット全体に対して操作を実行することです。

+2

行列(1:4,3,4)[、NA]と行列(1:4,3,4)[、NULL]は行列をすべてNAに設定し、それぞれNULLである。したがって、 'sum'の結果です。 – aichao

+1

foo2 = function(mat、j)substitute(sum(mat [、j])) 'のような関数を定義し、' foo2(matrix(1:4,3、 4)) ' –

0

@nya答えに加えて:

あなたは、関数を呼び出すときjの値が供給されているかどうかを評価する機能、内部のif -statementを挿入することによって、この動作を回避することができます。値が指定されていない場合、関数はエラーをスローします。

foo <- function(mat, j){ 
    if(missing(j)){    # Check if argument for j has been supplied 
     error("j is not inserted") 
    } else{ 
     v <- sum(mat[,j]) 
     return(v) 
    } 
    } 
関連する問題