Отслеживание текущего индекса при использовании

Хотел посмотреть, есть ли у кого-то более элегантное решение. Но каков подходящий способ отслеживания текущего индекса при использовании. Например, предположим, что я хотел взять ТОЛЬКО ТОЛЬКО из текущего элемента, который я оцениваю, идущего в конец моего вектора.

Это лучший способ сделать это?

y = rep(1,100)
apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])})

Я ценю ваш вклад.

Ответ 1

Это больше похоже на задачу для sapply:

sapply(seq_along(y), function(x){sum(y[x:length(y)])})

В вашем конкретном примере есть множество других параметров (например, изменение вектора y, а затем использование cumsum), но я предполагаю, что это общий шаблон: используйте seq_along или в худшем случае seq, чтобы получить интересующую вас последовательность, и передайте ее на *apply.

Ответ 2

rev(cumsum(y)) будет намного быстрее в текущем экземпляре:

> y = rep(1,100000)
> system.time(apply(as.matrix(seq(1:length(y))),1,function(x) { sum(y[x:length(y)])}) )
   user  system elapsed 
 88.108  88.639 176.094 
> system.time( rev(cumsum(y)) )
   user  system elapsed 
  0.002   0.001   0.004 

Ответ 3

Ну, пример может быть несколько неудачным, но вопрос о том, как узнать об индексе, находящемся в функции "apply" или "sapply", остается без ответа.

То, что вы можете посмотреть, это

x <- 0
l <- 1:10; names(l) <- letters[l]
sapply(l,function(Y) {
   x <<- x+1
   a<-sum(x:length(l))
   cat("I am at ",names(l)[x]," valued ",a,".\n",sep="")
   return(a)
})

Я тоже недоволен, несмотря на трюк "<" - для ссылки на внешние переменные (спасибо, Стефан). Особенно, когда вы работаете параллельно, вы хотите, чтобы семантика как-то четко выражалась, запрашивая индекс или позицию x/y в применении или применении. Лучшие идеи приветствуются.

Ответ 4

Этот ответ еще не получил удовлетворительного ответа. Глобальная переменная работает так, как запрашивается smoe, но она не выглядит быстрее, чем цикл for, см. пример ниже.

df=data.frame(a=1:100000,b=1:100000,y=rep(NA,100000))
ind=1
system.time(sapply(df$a,function(x){
  df$y[ind]<<-x+df$b[ind]
  ind<<-ind+1
}))

system.time(for(i in 1:nrow(df)){
  df$y[i]=df$a[i]+df$b[i]
})