2012-01-12 11 views
6

R en ifelse inanılmaz kullanışlı olsa da, belirli bir eksiklik var Aranan: yes ve no tüm unsurları değerlendirilir çağrı ifelse(test, yes, no) yılında, hatta bu atılır olacağını.daha verimli ifelse()

Eğer karmaşık bir sayısal egzersiz ortasına kullanıyorsanız bu oldukça savurgan olan

, integrate, uniroot, optim ya da her neyse beslenen edilecektir bir işlevde söylüyorlar. f ve g belki daha iç içe ifelse 's içeren, keyfi olarak karmaşık veya yavaş fonksiyonları olmak üzere Örneğin, bir

ifelse(test, f(x, y, z), g(a, b, c)) 

olabilir.

ifelse için yedek yazılı olan herhangi biri, yalnızca yes/no öğelerini değerlendirecek olan bir yazı yazdı mı? Temel olarak,

hatları boyunca bir şey açık bir döngünün bulanıklığı/etkisizliği boyunca. Bu, R'nin içlerine girmeden bile mümkün mü?

+1

Sanırım açık döngüyü * kullanabiliyordum, ancak eski bir programcının Fortran'ı herhangi bir dilde yazabileceğini söyleyen eskileri takip ettiğimi hissediyordum .... –

+1

nasıl kullanılır? daha sonra ifelse() her eleman için değerlendirilir ve aynı şekilde 'evet' ve 'hayır sadece ilgili unsurlar için değerlendirilir, eğer benim uygulamamın yanlış olduğu anlaşılmasaydı, ama eminim ki bu benim için çalışmış olduğundan eminim – nzcoops

+0

I if() - else ile 'mapply' kullanmayı denedi ve bu, vectorized' ifelse'den 10 kat daha yavaştı! –

cevap

6

Bu sorunun ifelse olduğunu sanmıyorum. f ve g yalnızca ifadenizde bir kez değerlendirilmektedir. Bence senin sorunun, f ve g'un vektörlerle yavaş olduğunu düşünüyorum.

Aramaları, yalnızca vektörün bir alt kümesinde değerlendirilmek üzere f ve g olarak değiştirebilirsiniz.

out <- numeric(length(test)) #or whatever the output type is 
out[test] <- f(x[test], y[test], z[test]) 
out[!test] <- g(x[!test], y[!test], z[!test]) 

Sen test herhangi elemanları NA ise bu ayarlamak gerekir.

+0

Evet, bunu da yaptım, ama oldukça hantal. –

+4

Eğer 'f' ve' g' tüm vektörlerdeyse, o zaman bu en iyi seçeneğinizdir. Eğer değilse, herhangi bir döngü yapacaktır. Ve bunun çirkin bir kod olduğunu düşünürseniz (ki bu yeterince adil), bunu her zaman bir işleve sarın ve çok sık bakmadığınız bir dosyada saklayabilirsiniz. –