2015-10-20 4 views
-5

Что идиоматических путь в R к петле на 2 векторов, как это в PythonR цикл по нескольким переменным

for i,j in zip(Is, Js) 

Очевидный путь в R должен пойти по индексу

for (idx in seq_along(Is)) { 
    i = Is[idx] 
    j = Js[idx] 

}

Просто интересно, существует ли менее громоздкий способ?

Edit:

Я использую цикл для параметров сканирования, а затем черчения. Также будет полезен предпочтительный способ избежать цикла. Так, например

results = data.table() 
for (threshold in c(2,3,4,5)) { 
    largeRtn = rtn[abs(rtn)>threshold*volatility] 
    results = rbind(results, someAnalysis(largeRtn)) 
    qplot(largeRtn, ...) 
} 
+6

Можете ли вы рассказать о том, чего вы пытаетесь достичь? Как правило, for-loops в R не подходят. Вы можете рассмотреть возможность предоставления [воспроизводимого примера] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – Heroka

+0

избегайте этого, когда вы можете - большинство функций принимают векторы в качестве входных данных, там arent nice iterators, как в python. – jenesaisquoi

+0

@Heroka, я добавил один пример, хотя все еще не «рабочий пример». – jf328

ответ

2

Я не уверен, что ваш код питона делает, но может быть, foreach и iterators пакеты вариант:

library(foreach) 
library(iterators) 

zip <- function(...) iter(obj = expand.grid(...), by = "row") 
foreach(d = zip(i = 1:3, j = 5:10), .combine = c) %do% {d[,"i"] * d[,"j"]} 
#[1] 5 10 15 6 12 18 7 14 21 8 16 24 9 18 27 10 20 30 

Конечно, следует избегать петель, если это возможно.

2

Нечто подобное, как правило, R-типа:

func = function(a, b) { 
    return(a*b) 
} 
a = c(2,3,1,7,8) 
b = c(4,6,7,0,1) 
mapply(func, a = a, b = b) 
[1] 8 18 7 0 8 

Конечно, в этом случае, можно легко сделать это векторизованную:

a * b 
[1] 8 18 7 0 8 

Но в более сложных случаи, векторизация может быть не вариантом, тогда вы можете использовать первый подход.

Возможно, this tutorial Я написал, может вам помочь.

Смежные вопросы