SORU
9 EYLÜL 2012, Pazar


Neden `vapply` daha güvenli `sapply`?

Belgelere diyor

vapply daha güvenli olabilir sapply, benzer, ancak dönüş değeri önceden belirlenmiş bir tip, [ ... ] kullanmak.

Genellikle daha güvenlidir, neden, belki örnekler sunarak bilgi verebilir misiniz?


P. S.: ben cevabı biliyorum zaten sapply önlemek eğilimindedir. Ben sadece burada güzel bir cevap için arkadaşlarımı bulamıyorum ... yani olsaydı. Lütfen, "el" cevap. okuyun

CEVAP
9 EYLÜL 2012, Pazar


Zaten not edilmiştir, vapply olarak iki şey yapar:

  • Hafif hızlı iyileşme
  • Sınırlı geri dönüş tipi kontrolleri sağlayarak tutarlılık geliştirir.

İkinci nokta gerçekleşmeden önce hataları yakalamak yardımcı olur ve daha sağlam kod neden olarak büyük avantajı. Bu bir dönüş değeri kontrol yapılabilir ayrı ayrı kullanarak sapply ardından stopifnot emin olmak için dönüş değerleri ile tutarlı ne bekliyordunuz, ama vapply biraz daha kolay (daha sınırlı, o zamandan beri özel hata kontrol kodu olabilir kontrol değerleri içinde sınırları, vb.).

İşte vapply örneği sonuç beklendiği sağlanması. Bu paralellikler bir şey üzerinde çalışıyordum sırasında PDF kazıma, nerede findD ister kullanın maç desen ham metin veri (örneğin benim elime bir liste oldu split ile varlık, ve bir düzenli ifade maç adresler içinde her varlık. Bazen PDF emri dışında olmuşlardı ve kötülük neden olan bir varlık) için iki adres var.

> input1 <- list( letters[1:5], letters[3:12], letters[c(5,2,4,7,1)] )
> input2 <- list( letters[1:5], letters[3:12], letters[c(2,5,4,7,15,4)] )
> findD <- function(x) x[x=="d"]
> sapply(input1, findD )
[1] "d" "d" "d"
> sapply(input2, findD )
[[1]]
[1] "d"

[[2]]
[1] "d"

[[3]]
[1] "d" "d"

> vapply(input1, findD, "" )
[1] "d" "d" "d"
> vapply(input2, findD, "" )
Error in vapply(input2, findD, "") : values must be length 1,
 but FUN(X[[3]]) result is length 2

Öğrencilerime söylediğim gibi, bir programcı olmanın bir parçası da "hataları rahatsız edici" hatalar benim arkadaşım. "" zihniyet değişiyor

Sıfır uzunluk girdi
İlgili bir nokta, eğer giriş uzunluğu sıfır, *14,* Her zaman boş bir liste, giriş türü ne olursa olsun dönecektir. Karşılaştırın:

sapply(1:5, identity)
## [1] 1 2 3 4 5
sapply(integer(), identity)
## list()    
vapply(1:5, identity)
## [1] 1 2 3 4 5
vapply(integer(), identity)
## integer(0)

vapply ile çıkış belirli bir türü için garantili, sıfır uzunluğu girişi için ekstra Çek yazmaya gerek yok.

Kriterler

vapply zaten sonuçlarını bekliyor ne olması gerektiğini bilir, çünkü biraz daha hızlı olabilir.

input1.long <- rep(input1,10000)

library(microbenchmark)
m <- microbenchmark(
  sapply(input1.long, findD ),
  vapply(input1.long, findD, "" )
)
library(ggplot2)
library(taRifx) # autoplot.microbenchmark is moving to the microbenchmark package in the next release so this should be unnecessary soon
autoplot(m)

autoplot

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • Theodore Leaf

    Theodore Lea

    29 AĞUSTOS 2006
  • USI Events

    USI Events

    6 AĞUSTOS 2013