1. ホーム
  2. r

[解決済み] Rにおけるドットの意味 - 個人的な好み、命名規則、それとももっと?

2023-05-14 11:55:55

質問

私は(おそらく)以下のような意味の "他のすべての変数" を指しているのではありません。 var1~. のような意味です。 私が指摘されたのは plyr をもう一度調べてみると mlply を見て、なぜパラメータはこのように先頭のドットで定義されるのだろうと思いました。

function (.data, .fun = NULL, ..., .expand = TRUE, .progress = "none", 
.parallel = FALSE) 
{
if (is.matrix(.data) & !is.list(.data)) 
    .data <- .matrix_to_df(.data)
f <- splat(.fun)
alply(.data = .data, .margins = 1, .fun = f, ..., .expand = .expand, 
    .progress = .progress, .parallel = .parallel)
}
<environment: namespace:plyr>

これの使い道は何ですか?単なる個人的な好みなのか、命名規則なのか、それ以上なのか?Rは機能的すぎて、とっくにやってるトリックを見逃すことがよくあります。

どのように解決するのですか?

関数名のドットは、以下のいずれかを意味します。

  • 全くなし
  • S3メソッドにおけるメソッドとクラスの間のセパレータ
  • 関数名を非表示にする

考えられる意味

1. 全くない

のドットは data.frame で区切られていない data から frame から、視覚以外では

2. S3メソッドにおけるメソッドとクラスの分離

plot は、一般的なS3メソッドの一例です。 このように plot.lmplot.glm を呼び出すときに使用される基礎となる関数定義です。 plot(lm(...)) または plot(glm(...))

3. 内部機能を隠したい

パッケージを書くとき、関数名に先行ドットを使うと便利なことがあります。 パッケージの純粋な内部関数として意図されている関数は、時々これを使用します。

この文脈では、quot;somewhat hidden" は単に、変数 (または関数) を ls() . 強制的に ls にこれらの変数を表示させるには ls(all.names=TRUE) . 変数の最初の文字にドットを使うことで、変数自体のスコープを変更することができます。 例えば

x <- 3
.x <- 4

ls()
[1] "x"

ls(all.names=TRUE)
[1] ".x" "x" 

x
[1] 3
.x
[1] 4

4. その他の考えられる理由

ハドレーでは プライヤ パッケージでは、関数名の先頭にドットを使用する慣習があります。 これは、変数名を解決するときに、値が内部関数変数ではなく、ユーザー変数に解決されることを保証しようとするメカニズムとしてです。


複雑化

このように異なる用途が混在していると、同じ関数名で異なる用途が混在することになり、非常に混乱した状況になることがあります。

例えば data.frame をリストに変換するには as.list(..)

as.list(iris)

この場合 as.list は S3 のジェネリックメソッドであり、そのメソッドに data.frame を渡しています。 したがって、S3関数は as.list.data.frame :

> as.list.data.frame
function (x, ...) 
{
    x <- unclass(x)
    attr(x, "row.names") <- NULL
    x
}
<environment: namespace:base>

そして、本当に壮大なものを作るために data.table パッケージを読み込んで、関数 as.data.table.data.frame :

> library(data.table)

> methods(as.data.table)
[1] as.data.table.data.frame* as.data.table.data.table* as.data.table.matrix*    

   Non-visible functions are asterisked


> data.table:::as.data.table.data.frame
function (x, keep.rownames = FALSE) 
{
    if (keep.rownames) 
        return(data.table(rn = rownames(x), x, keep.rownames = FALSE))
    attr(x, "row.names") = .set_row_names(nrow(x))
    class(x) = c("data.table", "data.frame")
    x
}
<environment: namespace:data.table>