2015-05-11 20 views
7

için sor. R'de bir fonksiyon yazmayı deniyorum. Her iki giriş de ayarlanmadıysa, girişleri sorar ve ardından işlevi sürdürür.R fonksiyonu; Girdi verilmediyse,

Input < - function(j,k){ 
    if ((j==j)&&(k==k)){ 
     j <- readline(prompt="Enter Input 1: ") 
     k <- readline(prompt="Enter Input 2: ") 
     Input(j,k) 
    }else if ((j=="<string here>")&&(k=="<string here>")){ 
     .... 
    } 
} 
+0

"Ne giriş ayarlanmış" ne anlama gelir? Cevapların çoğu, eğer biri belirlenmemişse, yani ilk satırda "veya" mantığına sahip olursanız, fakat "ve" mantığına sahip olursanız, bu demektir. Bunları ayrı ayrı kontrol etmek isteseniz daha muhtemel görünüyor; Yani, j' eksikse, j' için sor, ve eğer 'k' eksikse,' k' için sor. Teşekkürler. – Aaron

cevap

3

Ben isteğe bağlı argümanları kullanarak ve kuşkusuz sizin yayınlanan soru çok muğlak olsa da, devam etmeden önce boş olmayan olup olmadığını görmek için test bu olurdu yaklaşımınızı yapılandırmaya iyi bir yol düşünüyorum:

Input < - function(j=NA, k=NA) { 
    if (is.na(j) | is.na(k)){ 
    j <- readline(prompt="Enter Input 1: ") 
    k <- readline(prompt="Enter Input 2: ") 
    Input(j, k) 
    } else if ((j == "<string here>") & (k == "<string here>")) { 
    .... 
    } 
} 
+1

İsteğe bağlı işlev argümanları için 'NULL' tercih edilir - bkz. Ör. 'plot.default' - sonra' s.null' kullanarak test edebilirsiniz – thelatemail

+0

Bu durumda neden tercih edilir emin değilim? En iyi ihtimalle eşdeğer ama alakasız olurdu? Aslında, ona tekrar baktığımda, kullanıcının istemlerden birini veya her ikisini birden yazmaması durumunda, işlevin giriş değerlerini yeniden sormasını isterseniz, tercih edilen varsayılan değer boş bir dize olabilir. –

+1

Bu durumda her şeyden farklı bir şey yapamaz, ancak beklentilere bağlı olarak sorunlara neden olabilir, örn. “NULL” bir şey değil, uzunluk değil, “NA” bir uzunluk == 1, mantıksal sınıf vektörüdür. Gerçekten eşdeğer değiller ama buradaki küçük bir sorun. Büyük tartışmaya başlamak için değil. – thelatemail

3

Ben şahsen tercih etse is.NA veya is.NULL (@Forrest 'ın cevabı olduğu gibi), bu

Input <- function(j, k) { 
    if (missing(j) | missing(k)){ 
    j <- readline(prompt="Enter Input 1: ") 
    k <- readline(prompt="Enter Input 2: ") 
    Input(j, k) 
    } else if ((j == "<string here>") & (k == "<string here>")) { 
    .... 
    } 
} 
R.

ile şimdi başlıyor birisi için daha basit görünebilir missing ile bir alternatiftir
+0

Bu durumda, aslında j (j) ve k 'argümanları için bir değer sağlamadan Input() işlevini çağıramazsınız. Bunları, isteğe bağlı olmayan argümanlar olarak belirttiğinizden hiçbir zaman eksik olamazlar. –

+0

Bu işlev benim için çalışır (R sürüm 3.2.0). R'nin aslında bir şekilde kullanılmadıkça işlevlerde yer alacak argümanları gerektirdiğini sanmıyorum. U-işlevini (x) yazdırmayı (1); u() 'deneyin. –

+0

Evet, R'nin rolünde iyi bilinen ve iyi bir davranış. Ama bu işe yaramaz: 'u <-fonksiyon (x) {x == x; print (1)}; u()' ve yukarıda yazılan fonksiyon, j' ve 'k'' dır. her ikisi de varsayılan olarak verilmediğinden ve işlev bildiriminin içinde kullanıldığından geçilir. –

3

Belki de argüman olarak readline kodunu koymak için en basit olduğunu düşünüyorum. force komutları, bu kodun işlevdeki o noktasında değerlendirilmesini zorlar. Gerekli olduklarını düşünmüyorum ama başka ne işleve bağlı olarak, daha sonra yerine j ve k sorduğundan emin olmak isteyebilirsiniz; aksi halde, ilk olarak ne j ve k'un ne olduğunu bilmesi gerektiğinde kod değerlendirilecektir.

Input <- function(j = readline(prompt="Enter Input 1: "), 
        k = readline(prompt="Enter Input 2: ")) { 
    force(j) 
    force(k) 
    if ((j=="<string here>") && (k=="<string here>")) { 
     .... 
    } 
} 
+0

Bu çözümü, j/k'yi açıksa/sonra kontrol etmeyi ortadan kaldırdığı için beğeniyorum. Bence force(), hiç bir zaman bilemeyeceğiniz ya da ihtiyaç duyduğunuz fonksiyonlardan bir tanesidir, aksi takdirde kapsam belirleme hatalarını takip etmekte zorlanmıyorsanız, ama kesinlikle burada göstermek güzel. –