Domanda

sto usando ddply Per dividere un frame di dati e inviare i blocchi a una funzione. Prima di ddply Linea, ho impostato i=1. Quindi all'interno della funzione sto aumentando i in modo che ogni pezzo di dati ottiene un nuovo numero. Quando lo eseguo, tuttavia, i viene ripristinato a 1 ogni volta che viene chiamata la funzione. Presumo che questo sia perché il i al di fuori della funzione viene riassegnato ogni volta ddply Invia un nuovo pezzo di dati. C'è un modo per incrementare al di fuori della funzione e inviare quel numero insieme ai dati?

EDIT :: Ecco la riga di chiamata:

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

Ecco la funzione:

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

Soluzione

Questo è solo un normale problema di scoping in cui tu, se insisti a farlo, devi usare <<- Per l'incarico globale:

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> 

Altri suggerimenti

Potresti usare assign Per modificare il valore della variabile globale all'interno della tua funzione:

> x <- 10

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

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

Come potete vedere, test1 non fa quello che ti aspetti, mentre test2 fa.

modificare: Un approccio più conciso che ho appena scoperto leggendo il manuale è usare l'operatore "Superassignment" <<-:

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

Il manuale spiega La semantica del semplice incarico all'interno di una funzione:

Si noti che eventuali incarichi ordinari eseguiti all'interno della funzione sono locali e temporanei e perduti dopo l'uscita dalla funzione. Quindi l'incarico X <- qr(X) non influisce sul valore dell'argomento nel programma di chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top