2

ddplyデータ フレームを分割し、チャンクを関数に送信するために使用しています。行の前にddply、 を設定しi=1ます。次に、関数内でインクリメントiして、データの各チャンクが新しい番号を取得するようにします。ただし、これを実行するとi、関数が呼び出されるたびに 1 にリセットされます。これは、関数の外側が新しいデータのチャンクを送信するiたびに再割り当てされているためだと思います。ddply関数の外でインクリメントし、その数値をデータとともに送信する方法はありますか?

編集:: 呼び出し行は次のとおりです。

rseDF <- ddply(rseDF, .(TestCompound), .fun = setTheSet)

関数は次のとおりです。

##Set The Set Column
setTheSet <- function(df) {
if (df[,"TestCompound"] == "DNS000000001") df[,"Set"] <- "Control"
else {df[,"Set"] <- i
i <<- i+1}
return(df)
}
4

2 に答える 2

5

これは、これを行うことを主張する場合<<-、グローバル割り当てに使用する必要がある通常のスコープの問題です。

R> library(plyr)                    ## load plyr
R> i <- 1                           ## set counter
R> DF <- data.frame(a=rep(letters[1:3], each=3), b=1:9)
R> DF                               ## boring but simple data frame
  a b
1 a 1
2 a 2
3 a 3
4 b 4
5 b 5
6 b 6
7 c 7
8 c 8
9 c 9
R> ddply(DF, .(a), function(x) mean(x$b))     ## summarized
  a V1
1 a  2
2 b  5
3 c  8
R> ddply(DF, .(a), function(x) { i <<- i + 1; data.frame(i=i, res=mean(x$b)) })
  a i res
1 a 2   2
2 b 3   5
3 c 4   8
R> 
于 2011-09-07T16:13:11.497 に答える
2

assign関数内からグローバル変数の値を変更するために使用できます。

> x <- 10

> test1 <- function() { x <- 3 }
> test1()
> x
[1] 10

> test2 <- function() { assign('x', 3, envir = .GlobalEnv) }
> test2()
> x
[1] 3

ご覧のとおり、test1期待どおりに動作しませんが、test2動作します。

編集:マニュアルを読んで発見したより簡潔なアプローチは、「スーパー割り当て」演算子を使用することです<<-

> test3 <- function() { x <<- 17 }
> test3()
> x
[1] 17

マニュアルでは、関数内の単純な割り当てのセマンティクスについて説明しています。

関数内で行われる通常の割り当てはローカルで一時的なものであり、関数を終了すると失われることに注意してください。したがって、代入X <- qr(X)は、呼び出し側プログラムの引数の値には影響しません。

于 2011-09-07T16:12:49.040 に答える