2016-03-21 21 views
0

Aşağıda c_data adlı bir veri çerçevesi oluşturuyorum. ri değişkeninin bir eksik değeri olduğunu unutmayın.NULL işlevi çıktığında nereden geliyor?

Daha sonra verileri denetleyen bir işlev yazıyorum. Bir adım ri eksik veri varsa bu işlevi durdurmaktır. (Bu işlevin sözümle alakası olmayan sözdizimini kaldırdım).

Çıktı sağlarım.

İşlev, beklenen sonuca ek olarak NULL'u yazdırdığı sürece beklendiği gibi çalışır. Neden NULL yazıyor?

myFun(ri = r, ni = N, data = c_data) 

##Number of missing values in ri is 1 
##NULL 
## Error in myFun(ri = r, ni = N, data = c_data) : 
## ri has missing data. myFun is terminated. 

Neden NULL yazdırmak kapsamaz:

#create data to test function 
r <- c(.15, .10, NA) 
N <- c(100, 86, 56) 
chrvar <- c("a", "b", "c") 
c_data <- as.data.frame(cbind(r,N, chrvar)) 
#change variable type from factor to numeric 
c_data$r <- as.numeric(c_data$r) 
#change N variable type from factor to integer 
c_data$N <- as.integer(c_data$N) 
#change chrvar from factor to character 
c_data$chrvar <- as.character(c_data$chrvar) 
str(c_data) 


myFun <- function(ri= ri, ni=ni, data = data) 
{ 

    #add ri and ni to the data frame named data 
    data$ri <- ri 
    data$ni <- ni 

    #does ri have any missing data 
    num.missing.ri <- 0 
    for (i in 1:nrow(data)) 
    { 
     if (is.na(data$ri[i] == TRUE)) num.missing.ri = num.missing.ri + 1 
    } 
    if(num.missing.ri != 0) 
    { 
    print(cat("Number of missing values in ri is", num.missing.ri,"\n")) 
    stop("ri has missing data. myFun is terminated.") 
    } 

} 

     myFun(ri = r, ni = N, data = c_data) 

Bu, bu çıktıyı üretir? cat işlevinin dönüş değeri olduğu için

+0

Sadece FYI, bir sütundaki eksik değerlerin sayısını 'sum (is.na (data $ column))' – adibender

+0

ile edinebilirsiniz. Bunun nedeni, işlevinizin gerçekten herhangi bir değer döndürmemesi olabilir, bunun yalnızca R'ye yazdırılması anlatılıyor olabilir bu şart altında. Muhtemelen fonksiyonu tanımlarken 'return' komutunu uygulamayı deneyin? – cgage

+0

çift şey: ilk fark ettim (is.na (veri $ ri [i] == DOĞRU)) değerinin true olup olmadığını kontrol ediyor. Parantezleriniz eşleşmedi. İkincisi, benden önce bahsettiğiniz gibi, bir satırda yapılabilir. – Marsenau

cevap

4

NULL yazdırılır. print ve cat'a ihtiyacınız yoktur. Senin durumunda cat yılında

x <- cat("asdf") 
x 
##NULL 
print(x) 
##NULL 

eksik değerler hakkında bilgi yazdırır ve sonra print Bilginize NULL

olan cat tarafından döndürülen değeri, yazdırır: Bu daha verimli hale getirebilir, örneğin:

if(any(ind.na <- is.na(c_data$ri))) stop(paste("ri has", sum(ind.na), "missing values")) 
+0

Alternatif olarak, sadece 'cat' yerine 'paste 'kullanın ve NULL çıktılarını görmezsiniz. – giraffehere

+0

Yardımlarınız için teşekkürler> Bunu takdir ediyorum. – user2502904

+0

@ user2502904. Hoş geldiniz, size yardımcı olan cevapları kabul etmeyi unutmayın (daha önce sorduğunuz sorularda da) – adibender

1

@adibender bunu doğru bir şekilde yanıtladı.

print(paste("Number of missing values in ri is", num.missing.ri)) 

Ayrıca, ben sadece işlevlerine yeni olduğundan bir not yapmak istedim:

cat("Number of missing values in ri is", num.missing.ri,"\n") 

Ya da bu:

Sadece bunu. myFun işlevinizi yazdığınızda, değişkenleriniz için varsayılan durumlar ayarlıyorsunuz.

Bu nedenle, işlevinizi function(ri = ri, ni = ni, data = data) olarak başlattığınızda, R'ye, kullanıcının işlev çağrısından ri, ni ve/veya verileri çıkardığı durumda bunun yerine ri, ni ve/veya verilerini kullanacağını söylüyorsunuz. . Başka bir deyişle, ri, ni veya başka bir yerde verisi olmadıkça, bu işlev için bir anlam ifade etmiyor.

Bunun yerine, işlevi function(ri, ni, data) olarak yazabilirsiniz ve kullanım bu bağımsız değişkenleri devre dışı bırakırsa R hata atacaktır.

İlgili konular