9

組み込み関数のように関数内の環境名を表示する方法は?たとえば、function: mean available in base パッケージを入力すると、環境が "namespace:base" として表示されます。

mean

   function (x, ...) 
   UseMethod("mean")
   <bytecode: 0x0547f17c>
   **<environment: namespace:base>**

ただし、新しく作成した環境に関数をアタッチすると、関数 (f) 内の自由変数 (z) の値にアクセスするために、.GlobalEnv 環境に自動的に常駐し、環境の名前は内部に表示されません。機能ですが、(e1)環境のメモリアドレス「0x051abd60」が見えます。

     e1 <- new.env()
     e1$z <- 10
     f <- function(x) {
           x + z 
      }
     environment(f) = e1
     f

               function(x) {
                    x + z 
               }
               **<environment: 0x051abd60>**

この動作が見られるのはなぜですか? R の組み込み関数や、さまざまな R パッケージから利用できる関数のように、関数内で自分の環境名を取得しないのはなぜですか? 環境データ構造と、search() から利用可能な .GlobalEnv 環境に違いはありますか

この動作の背後にある動機へのポインタは高く評価されます。

ありがとうございました

4

4 に答える 4

6

私の記憶が正しければ、パッケージと名前空間の環境名は C レベルで割り当てられます。そのため、ユーザーが作成した環境は名前を明らかにしません。と呼ばれる (誤解を招くような名前の) 基本関数があるにもかかわらず、R で環境名を設定することはできませんenvironmentName()。C レベルで割り当てられた名前のみを返します。これは実際にはパッケージと名前空間のみを対象としており、他の環境では意図されていません。

于 2012-10-02T21:47:15.973 に答える
3

ほとんどの環境には名前がありません。環境の名前は環境の特別な属性であり、その環境を指すオブジェクトの名前ではありません。たとえば、次の場合、f の環境の「名前」は何になると思いますか?

e1 <- new.env()
e1$z <- 10
e2 <- e1
e3 <- e1

f <- function(x) {
  x + z 
}
environment(f) <- e1

identical(e1, e2)
identical(e1, e3)
于 2012-10-08T14:42:27.040 に答える