sapply和环境

时间:2012-03-06 20:10:21

标签: r

以下循环修改blocsapply()可以达到相同的效果吗?

或者换句话说,可以sapply()更新基础环境中的变量吗?我尝试使用assign()但没有成功。谢谢。

n <- 100 
fencePosts <- c(17,34) 
bloc <- rep(0,n) 
for (i in 1:length(fencePosts)){   
  bloc[fencePosts[i]:n] = i 
} 
table(bloc)

我正在考虑类似下面的行,但当然bloc超出了范围(虽然我不确定为什么这不会引发“bloc未找到”错误)

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] = i)

3 个答案:

答案 0 :(得分:3)

我没有看到sapply使用这种方式,即使可能,我也不确定这是个好主意。 sapply的主要用途是在列表的不同元素上执行相同的任务,然后以有用的方式收集结果。这与该用法不符,因此我认为即使可能,代码也难以阅读和维护。

在这种特殊情况下,为什么不使用rep

bloc <- rep(seq_len(length(fencePosts)+1), diff(c(1,fencePosts,n+1))

至于为什么它不起作用,它确实与范围界定有关;约翰福克斯的一个很好的参考: http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-scope.pdf

答案 1 :(得分:2)

我不知道R-perts是多么犹豫,但你可以做到

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] <<- i)

答案 2 :(得分:0)

在这种情况下,您实际上不需要任何作业 在循环内部或sapply内部。

sapply( 1:n, function(u) sum(u >= fencePosts) )