以下循环修改bloc
。 sapply()
可以达到相同的效果吗?
或者换句话说,可以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)
答案 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) )