我正在运行一个模拟,我需要跟踪特定条件的函数调用中出现的次数。我试图通过赋值给全局对象来实现这一点。如果你运行这个函数,它会起作用,但如果你按照我正在做的那样尝试lapply
函数,那么你得到条件发生的所有时间的单一计数,而不是每次发生的每个元素的计数。 list
已投放到lapply
。
这是一个虚拟情况,其中出现的是数字的均匀性:
FUN <- function(x){
lapply(1:length(x), function(i) {
y <- x[i]
if (y %% 2 == 0){
assign("count.occurrences", count.occurrences + 1, env=.GlobalEnv)
}
print("do something")
})
list(guy="x", count=count.occurrences)
}
#works as expected
count.occurrences <- 0
FUN(1:10)
count.occurrences <- 0
lapply(list(1:10, 1:3, 11:16, 9), FUN)
#gives me...
#> count.occurrences
#[1] 9
#I want...
#> count.occurrences
#[1] 5 1 3 0
这是一个模拟,所以速度是一个问题。我希望这一点尽可能快,所以我没有嫁给全球任务理念。
答案 0 :(得分:8)
为什么不分配到FUN
内部环境,而不是分配给全球环境?
FUN <- function(x){
count.occurances <- 0
lapply(1:length(x), function(i) {
y <- x[i]
if (y %% 2 == 0){
count.occurances <<- count.occurances + 1
}
print("do something")
})
list(guy="x", count=count.occurances)
}
Z <- lapply(list(1:10, 1:3, 11:16, 9), FUN)
然后你可以把数字拉出来。
> sapply(Z, `[[`, "count")
[1] 5 1 3 0
答案 1 :(得分:2)
我没有对此进行任何基准测试,但您是否尝试使用for
循环?我知道R中通常不鼓励循环,但它们也不总是较慢。
FUN <- function(x) {
count.occurrences = 0
for (i in 1:length(x)) {
y = x[i]
if (y %% 2 == 0) {
count.occurrences = count.occurrences + 1
}
print("do something")
}
list(guy="x", count=count.occurrences)
}
lapply(list(1:10, 1:3, 11:16, 9), FUN)
答案 2 :(得分:0)
我可以这样说:
count.occurances <- 0
Z <-lapply(list(1:10, 1:3, 11:16, 9), FUN)
diff(c(0, sapply(1:length(Z), function(x) Z[[x]]$count)))
我愿意接受更好的想法(更快)。