SORU
31 Temmuz 2012, Salı


Açıkça bir fonksiyonu geri arama ya da değil

Bir süre önce I got rebuked ile Simon Urbanek gelen R core team (sanırım) tavsiye etmek için bir kullanıcı için açıkça arama return sonunda bir fonksiyon (yorum silindi ama):

foo = function() {
  return(value)
}

o tavsiye yerine:

foo = function() {
  value
}

Muhtemelen böyle bir durumda gereklidir:

foo = function() {
 if(a) {
   return(a)
 } else {
   return(b)
 }
}

Bu yorumu kesinlikle gerekli olmadıkça return aramadığın iyi bir şeydir, ama bu silindi neden biraz ışık tutacak.

Soru benim: return daha hızlı ya da daha iyi demiyor Neden, ve bu nedenle tercih edilir?

CEVAP
6 AĞUSTOS 2012, PAZARTESİ


Neden (açıkça) dönüş daha hızlı veya daha iyi, ve böylece tercih çağırıyor? soru şuydu:

R belgelerinde statemement böyle bir varsayım yapmak yok.
Adam sayfa Tha ?'işlev' der

function( arglist ) expr
return(value)

Daha hızlı geri çağırmadan mi?

Her iki function() return() ilkel fonksiyonlar ve kendisi bile return() fonksiyonu dahil olmadan son değerlendirmeye değer verir function().

Bağımsız değişken olarak son değeri .Primitive('return') return() arama aynı işi görür ama bir ara daha fazla ihtiyacı var. Bu (genellikle) gereksiz o kadar .Primitive('return') Ara ek kaynaklar çizebilirsiniz. Basit ölçüm aradaki fark çok küçük olduğunu gözler önüne seriyor ve böylece kesin dönüş kullanmamak için bir sebep olamaz. Aşağıdaki arsa verileri bu şekilde seçilen oluşturulur:

bench_nor2 <- function(x,repeats) { system.time(rep(
# without explicit return
(function(x) vector(length=x,mode="numeric"))(x)
,repeats)) }

bench_ret2 <- function(x,repeats) { system.time(rep(
# with explicit return
(function(x) return(vector(length=x,mode="numeric")))(x)
,repeats)) }

maxlen <- 1000
reps <- 10000
along <- seq(from=1,to=maxlen,by=5)
ret <- sapply(along,FUN=bench_ret2,repeats=reps)
nor <- sapply(along,FUN=bench_nor2,repeats=reps)
res <- data.frame(N=along,ELAPSED_RET=ret["elapsed",],ELAPSED_NOR=nor["elapsed",])

# res object is then visualized
# R version 2.15

Function elapsed time comparison

Yukarıdaki resim biraz platformda difffer olabilir. Esas ölçüm verileri, boyutu döndürülen nesne değil neden herhangi bir fark, sayı yineler (bile büyütülecektir) kılan sadece çok küçük bir fark, gerçek kelime ile gerçek veriler ve algoritma değil, sayılan veya betiği çalıştırmak daha hızlı.

Daha iyi geri çağırmadan mi?

Return açıkça "" kod sonu yordamı gereken yerde, işlevi atlama ve değerini döndürür. yaprakları tasarlamak için iyi bir araçtır

# here without calling .Primitive('return')
> (function() {10;20;30;40})()
[1] 40
# here with .Primitive('return')
> (function() {10;20;30;40;return(40)})()
[1] 40
# here return terminates flow
> (function() {10;20;return();30;40})()
NULL
> (function() {10;20;return(25);30;40})()
[1] 25
> 

O kullanım, geri dönüşü kullanabilir ne programcı strateji ve programlama modeline bağlıdır() gerekli değil gibi.

R çekirdek programcılar yani her iki yaklaşım kullanır. "baz" fonksiyonlar. kaynakları bulmak için mümkün olduğu kadar açık ve geri dönüşü olmayan)

Birçok kez sadece return () (bağımsız değişken) kullanılır conditially için durumlarda BOŞ dönen fonksiyonu dur.

Daha iyi ya da değil standart kullanıcı olarak ise belli değil veya analist R kullanarak gerçek bir fark göremiyorum.

Bence soru şu olmalı:Açık dönüş kullanarak herhangi bir tehlike R uygulama var mı?

Veya, daha iyi, kullanıcı yazma fonksiyon kodu her zaman sormalı belki de:Etkisi nedirdeğilfonksiyon kodu kullanarak açık dönüş (veya şube kodu son yaprak gibi döndürülecek nesneyi yerleştirerek)?

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006