2012-03-06 90 views
0

下面的循環修改blocsapply()可以達到相同的結果嗎?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) 

回答

1

我不知道它是對R-perts如何猶太教,但你可以做

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

我這樣做的時候,但是隻有當我可以包含被分配給所述對象,'bloc'和'sapply()'在一個小的函數調用,這需要'bloc'等作爲參數,並然後返回修改過的'bloc' – 2012-03-06 20:30:55

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

+0

謝謝你的例子和鏈接。 – 2012-03-06 21:00:12

0

在這種情況下,您並不需要在循環內部或sapply內部分配 。

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