我正在使用ddply
拆分数据框并将块发送到函数。在ddply
行之前,我设置了i=1
。然后在函数内部我递增i
,以便每个数据块都获得一个新数字。但是,当我运行它时,每次调用函数时i
都会重置为1。我假设这是因为每次i
发送一大块数据时,函数外部的ddply
都会被重新分配。有没有办法在函数外部递增并将该数字与数据一起发送?
EDIT :: 这是主叫行:
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)
}
答案 0 :(得分: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>
答案 1 :(得分: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
手册explains函数中简单赋值的语义:
请注意,在函数内完成的任何普通赋值都是本地的 和临时的,退出该功能后丢失。就这样 赋值
X <- qr(X)
不会影响参数的值 调用程序。