Саппи и окружающая среда - PullRequest
1 голос
/ 07 марта 2012

Цикл ниже изменяет 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 not found").

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

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Я не видел, чтобы sapply использовал этот способ, и даже если это возможно, я не уверен, что это хорошая идея. Основное использование sapply предназначено для выполнения одной и той же задачи с различными элементами списка, а затем для сбора результатов полезным способом. Это не соответствует этому использованию, поэтому я думаю, что код будет трудно читать и поддерживать, даже если это возможно.

В данном конкретном случае, почему бы не использовать rep?

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

Что касается того, почему это не работает, это имеет отношение к ограничению; одна хорошая ссылка Джона Фокса: http://cran.r -project.org / док / вно / Fox-Companion / приложение-scope.pdf .

2 голосов
/ 07 марта 2012

Я не знаю, насколько кошерно это для R-perts, но вы могли бы сделать

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] <<- i)
0 голосов
/ 08 марта 2012

В этом случае вам не нужно никакого присваивания внутри цикла или внутри sapply.

sapply( 1:n, function(u) sum(u >= fencePosts) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...