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 回答