Neden `vapply` daha güvenli `sapply`?
Belgelere diyor
vapply
daha güvenli olabilirsapply
, 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
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 regex 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)
Neden sıralanmamış bir dizi daha hızlı...
Neden baskı "B" baskı " ...
Neden bir döngü iki döngü daha yavaş g...
Neden Standart girdiden okuma satır Py...
Neden Python kodunu daha hızlı bir işl...