2010-02-01 26 views
38
yılında

benim Ar kod formunun tabloların içeren bolluğu biter etmek:alternatif R

if (!is.null(aVariable)) { 
    do whatever 
} 

Fakat iki müzakerelerine içerdiğinden açıklamada bu tür okumak zordur. !

if (is.defined(aVariable)) { 
     do whatever 
} 

tersi R standart bir is.defined tip fonksiyonu mevcut is.null yok mu

o: Ben böyle bir şey tercih ediyorum?

şerefe, yannick

+1

aVariable nereden gelir? Bir vektörde bir element, bir fonksiyona karşı global veya vektörel olmayan bir argüman mıdır? Daha fazla öneri alabilirim. –

+0

belki 'var', aradığınız şeye yakındır –

+1

Harlan'ın yorumunu 'var' ile ilgili olarak aşağıya bakın ... –

cevap

23

Sen kabul ettiği değer, fonksiyon veya kodunu yazın çalışma dışarı ve bu soran daha iyi olabilir:

if (is.integer(aVariable)) 
{ 
    do whatever 
} 

Bu ISNULL üzerinde bir gelişme olabilir bunun nedeni tip kontrolü sağlar. Öte yandan, kodunuzun jenerikliğini azaltabilir.

Alternatif olarak, sadece istediğiniz işlevi yapmak:

is.defined = function(x)!is.null(x) 
+2

'null' değerine sahip bir değişken bildirebileceğinizden beri' is.defined' adı tam olarak doğru değil . Örneğin, 'x <- NULL; x'. 'isnt.null', işlev için daha uygun bir ad olacaktır. Perl'de –

+0

, en azından, undef değerine sahipse, null gibi bir değişken tanımlanmamış olarak kabul edilir. –

7

Ian yorumunda bu koymak, ama iyi bir cevap olduğunu düşünüyorum: Değişken adı alıntı

if (exists("aVariable")) 
{ 
    do whatever 
} 

not söyledi. kolay okuma meselesi ise

+13

Bunun aynı olduğunu düşünmüyorum. "var", değişkenin bağlı olup olmadığını sınar. 'is.null' değişkenin bağlı olduğunu varsayar ve içeriğinin NULL nesnesi olup olmadığını sınar. Değiştirilemezler. – Harlan

14

, her zaman kendi fonksiyonunu tanımlayabiliriz:

is.not.null <- function(x) ! is.null(x) 

Böylece programın başından beri yanlış kullanabilir.

is.not.null(3) 
is.not.null(NULL) 
1

shiny paket değişkenleri mevcut ve geçerli hem olduklarını kontrol etmek için kullanışlı işlevler validate() ve need() sağlar. need() bir ifadeyi değerlendirir. İfade geçerli değilse, bir hata mesajı verilir. İfade geçerliyse, NULL döndürülür. Bir değişken geçerli olup olmadığını kontrol etmek için bunu kullanabilir. Daha fazla bilgi için bkz. ?need.

böyle bir işlevi tanımlayan öneriyorum:

is.valid <- function(x) { 
    require(shiny) 
    is.null(need(x, message = FALSE)) 
} 

xFALSE olup FALSE eğer is.valid() dönecektir Bu fonksiyon, NULL, NA, NaN, boş bir dize "", boş bir atom vektör, sadece içeren bir vektör eksik değerler, yalnızca FALSE içeren bir mantıksal vektör veya try-error sınıfının bir nesnesi. Diğer tüm durumlarda, TRUE döndürür. Bu, need() (ve is.valid()) 'un çok geniş bir aralıkta arıza durumlarını kapsadığı anlamına gelir.Bunun yerine yazma:

if (!is.null(x) && !is.na(x) && !is.nan(x)) { 
    ... 
} 

biri basitçe yazabilirsiniz: (https://csgillespie.github.io/efficientR/programming.html#communicating-with-the-user bakınız): sınıfa try-error için çek ile

if (is.valid(x)) { 
    ... 
} 

, hatta sessizce hataları yakalamak için bir try() blokta ile birlikte kullanılabilir

bad = try(1 + "1", silent = TRUE) 
if (is.valid(bad)) { 
    ... 
}