2014-10-27 10 views
7

Nedenbaşka fonksiyon içerisinde tanımlı bir işlev için aynı argüman isimlerini kullanarak

f <- function(a) { 
    g <- function(a=a) { 
     return(a + 2) 
    } 
    return(g()) 
} 
f(3) # Error in a + 2: 'a' is missing 

nedeni bir hata yapar? Özellikle değişken isimlerinin aynı olduğu gerçeği ile a = bir argüman ile ilgisi vardır. Tam olarak neler oluyor?

f <- function(a) { 
    g <- function(a) { 
     return(a + 2) 
    } 
    return(g(a)) 
} 
f(3) # 5 

f <- function(a) { 
    g <- function(g_a=a) { 
     return(g_a + 2) 
    } 
    return(g()) 
} 
f(3) # 5 

g <- function(a) a + 2 
f <- function(a) g(a) 
f(3) # 5 

cevap

6

sorundur as explained in the R language definition ki: İlk kod bloğunda

The default arguments to a function are evaluated in the evaluation frame of the function.

, herhangi bir bağımsız değişkeni olmadan g() çağırdığınızda, geri a olduğunu a olarak standard, üzerine düşer. "İşlev çerçevesinde" (yani, aramanın g() numaralı telefonuna yarattığı ortam) değerlerinde, adı a sembolü ile eşleşen ve değeri a olan bir bağımsız değişken bulur. a'un değerine bakıldığında, adı bu simgeyle eşleşen ve değeri a olan bir bağımsız değişken bulur. Gördüğünüz gibi

, sen olan bir döngünün içinde sıkışmış bittiğinde ... Ne hata mesajı söylemeye çalışıyor: g(a) çağırır

Error in g() : 
    promise already under evaluation: recursive default argument reference or 
earlier problems? 

Sizin ikinci girişimi, as explained in the same section of R-lang, sen bir tartışma temin ettik çünkü, beklendiği gibi çalışır ve: Orada

The supplied arguments to a function are evaluated in the evaluation frame of the calling function.

bir sembol bulur a, dış fonksiyonun resmi argümanı a'a girdiğiniz her şeye bağlıdır ve her şey yolundadır.

4

sorun a=a parçasıdır: Burada

beklendiği gibi çalışmayabilir kod bazı benzer parçalarıdır. Bir argüman kendi varsayılanı olamaz. Bu dairesel bir referanstır. Bu örnek nasıl çalıştığını açıklamak yardımcı olabilir

: varsayılan 1 yoktur

x <- 1 
f <- function(a = x) { x <- 2; a } 
f() 
## [1] 2 

Not a olduğunu; varsayılan 2'ye sahiptir. Öncelikle fonksiyonun kendisinde varsayılan olarak görünür. Benzer şekilde a=a, a'un dairesel olan kendi varsayılan değeri olmasına neden olur.

+1

ve R 3.1.1'deki hata mesajı şu anda değerlendirme aşamasında olan g(): sözünde hata: özyinelemeli varsayılan argüman referansı veya önceki sorunlar? ' – Roland

+0

Gördüğüm hata mesajından çok daha yararlıdır (Hata: 'a' eksik). R sürüm 3.0.2 (2013-09-25) - "Frizbi Yelkeni" var – Adrian

İlgili konular