web-dev-qa-db-ja.com

vapplyのFUN.VALUE引数

vapplyFUN.VALUE引数がありません。これが私の例です:

a = list(list(1,2), list(1), list(1,2,3))

# give the lengths of each list in a
sapply(a, length)

今、私はvapplyの代わりにsapplyを使用してタイプセーフにしようとしています

# gives me same result as sapply
vapply(a, length, FUN.VALUE=1)

# same result, but why?
vapply(a, length, FUN.VALUE=1000)

# gives me error
vapply(a, length, FUN.VALUE="integer")

# gives me error
vapply(a, length, FUN.VALUE="vector")

# gives me error
vapply(a, length, FUN.VALUE=c(1,2))

?vapplyから、FUN.VALUEはスカラー、ベクトル、または行列であり、出力のタイプを照合するために使用されることを読みました。 vapplyがこのように動作する理由についてのヒントはありますか?

9
user1981275

vapplyドキュメントから、

_FUN.VALUE_(一般化された)ベクトル; FUNからの戻り値のテンプレート。詳細を見る'。

「戻り値を説明する文字列」ではなく、「戻り値のテンプレート」と表示されていることに注意してください。 詳細セクションを見ると、より多くのガイダンスが提供されます。

この関数は、FUNのすべての値が_FUN.VALUE_と互換性があることを確認します同じ長さとタイプである必要があります。 [強調を追加]

この例の関数length()は、長さ1の数値(具体的にする場合は整数)を返します。 _FUN.VALUE = 1_を使用する場合、_1_の長さとタイプは期待する出力と同じであるため、チェックに合格します。 _FUN.VALUE = "integer"_を使用する場合、_"integer"_は長さ1の文字ベクトルであるため、長さチェックは成功しますが、タイプチェックは失敗します。

それは続く:

(型は、論理<整数<二重<複素数の順序で上位の型に昇格できますが、降格することはできません。)

したがって、整数または倍精度の値を返す可能性のある関数をvapplyしている場合は、必ず_FUN.VALUE = 1.0_のようなものを指定する必要があります。

ドキュメントでは、配列/行列の処理方法について引き続き説明しています。ここにコピーして貼り付けません。

3
Gregor Thomas