2011-01-21 20 views

cevap

24

Sen apply(data,1,FUN,parameter=1) istiyorum. işlev tanımında ... Not:

> args(apply) 
function (X, MARGIN, FUN, ...) 
NULL 

ve belgelerde karşılık gelen bir giriş:

...: ‘FUN’ isteğe bağlı argümanlar.

13

Sen böylece EĞLENCE "x", ne olduğunu bilecek apply için çağrı içinde isimsiz işlev yapabilir:

apply(data, 1, function(x) FUN(x, parameter = 1)) 

bu yöntemi kullanmak altındaki örnekler için ?apply bakınız.

+0

sayesinde, Chase, bu görebiliriz aradığım şey ... – Produnis

+1

@Gavin - Açıklık veya performans noktalarındaki farkı anlamıyorum. R-doc'lar oldukça açık ki, '' '' FUN' için ek parametreler içindir, bu yüzden usulüne uygun olarak not edilmiştir. Bununla birlikte, bu anonim işlev yeteneğine gereksinim duymak karmaşıklıktaki küçük bir sıçrama ve OP'nin daha önce bu "hileyi" bilmediğini tahmin ediyorum. – Chase

+0

Gerçekten de, bir oylama değil, bir yorum. Hiç yazdığın şeyle ilgili yanlış bir şey yok. Eleştiri olarak değil. –

3

İşte ... nesne ve *apply kullanarak argümanları geçen pratik bir örnek. Bu kaygan ve bu kullanımı açıklamak için kolay bir örnek gibi görünüyordu. Unutulmaması gereken önemli bir nokta, bir argümanı ... olarak tanımladığınızda, bu işlevin tüm çağrısının adlandırılmış argümanlara sahip olması gerekir. (böylece R, nereye koymaya çalıştığını anlıyor). Mesela ben times <- fperform(longfunction, 10, noise = 5000) denilen olabilirdi ama ... Benim kişisel tarzı geçirilir bir ... Emin olmak için kullanılırsa argümanlar isim niteliğinde çünkü noise = kapalı bırakarak bana bir hata verirdi.

Sen argüman noisefperform(FUN = longfunction, ntimes = 10, noise = 5000) çağrısına tanımlanan ediliyor ama diff <- rbind(c(x, runtime(FUN, ...))) için çağrı ile başka 2 seviyeleri için kullanılmıyor ve sonuçta fun <- FUN(...)

# Made this to take up time 
longfunction <- function(noise = 2500, ...) { 
    lapply(seq(noise), function(x) { 
    z <- noise * runif(x) 
    }) 
} 

# Takes a function and clocks the runtime 
runtime <- function(FUN, display = TRUE, ...) { 
    before <- Sys.time() 
    fun <- FUN(...) 
    after <- Sys.time() 
    if (isTRUE(display)) { 
    print(after-before) 
    } 
    else { 
    after-before 
    } 
} 

# Vectorizes runtime() to allow for multiple tests 
fperform <- function(FUN, ntimes = 10, ...) { 
    out <- sapply(seq(ntimes), function(x) { 
    diff <- rbind(c(x, runtime(FUN, ...))) 
    }) 
} 

times <- fperform(FUN = longfunction, ntimes = 10, noise = 5000) 

avgtime <- mean(times[2,]) 
print(paste("Average Time difference of ", avgtime, " secs", sep=""))