私は絶対にアタッチしないでください。 with
とwithin
はお友達です。
例コード:
> N <- 3
> df <- data.frame(x1=rnorm(N),x2=runif(N))
> df$y <- with(df,{
x1+x2
})
> df
x1 x2 y
1 -0.8943125 0.24298534 -0.6513271
2 -0.9384312 0.01460008 -0.9238312
3 -0.7159518 0.34618060 -0.3697712
>
> df <- within(df,{
x1.sq <- x1^2
x2.sq <- x2^2
y <- x1.sq+x2.sq
x1 <- x2 <- NULL
})
> df
y x2.sq x1.sq
1 0.8588367 0.0590418774 0.7997948
2 0.8808663 0.0002131623 0.8806532
3 0.6324280 0.1198410071 0.5125870
編集:ハドレーはコメントで変換言及しています。ここにいくつかのコードがあります:
> transform(df, xtot=x1.sq+x2.sq, y=NULL)
x2.sq x1.sq xtot
1 0.41557079 0.021393571 0.43696436
2 0.57716487 0.266325959 0.84349083
3 0.04935442 0.004226069 0.05358049
'transform'は内部の別の便利なバリエーションです。 – hadley
実際には、 'attach()'とは違って、 'with()'が関数を "解決"しないことに気がつきました。最初に 'printx < - function {print(x)}'を設定します。 'with(list(x = 42)、print(x))'と 'attach(list(x = 42));にもかかわらず' with(list(x = 42)、printx()) 'は失敗します。 printx() '成功! :( –