-5

データ フレーム オブジェクトが更新されない理由がよくわかりません

d <- data.frame(titi=c(0))
(function(dataset) {
  dataset[["toto"]] <- 1;
  print(names(dataset)) #has "toto" and "titi"
})(d)
print(names(d)) # no has "toto", only "titi" 

ここで何が起こっているのですか?

私のコードでは、変数もキャプチャし、キャプチャしたものを で更新するため、回避策があります<<-が、メカニズムを知りたいです。

私は一般的な変異の危険性などを認識しています。ここでのメカニズムがわかりません。

編集

これは言語レベルの機能であるというコンセンサスのように見えますが、私はその議論には従いません。あたかも私が近い構造であるデータテーブルを使用しているかのように、それは変化する可能性があります。

d <- data.table(titi=c(0))
(function(dataset) {
  dataset[,toto:=1]
  print(names(dataset)) #"titi" "toto"
})(d)
print(names(d)) #"titi" "toto"
4

3 に答える 3

3

これは、意図したように見えること、つまりリスト引数を「参照によって」変更するように見える無名関数の使用を達成するコードです。

d <- data.frame(titi=c(0))
(function(dataset) { nam <-deparse(substitute(dataset))
   dataset[["toto"]] <- 1; assign(nam ,  dataset, envir=parent.frame() )
   print(names(dataset)) #has "toto" and "titi"
 })(d)
#[1] "titi" "toto"
 print(names(d))
#[1] "titi" "toto"
 d
#  titi toto
#1    0    1

次の方法よりも簡単で効率的であるとは思わないでしょう。

d <- data.frame(titi=c(0))
 addcol <- function(dataset) { 
   dataset[["toto"]] <- 1
   dataset}
d <-addcol(d)
d
#  titi toto
#1    0    1
于 2013-08-13T02:15:27.837 に答える