2016-03-21 56 views
0

下面我創建一個名爲c_data的數據框。請注意,變量ri有一個缺失值。函數輸出中的NULL來自哪裏?

然後我寫一個函數來檢查數據。如果ri缺少數據,則一步就是停止該功能。 (我從函數中刪除了與我的問題不相關的語法)。

我提供輸出。

函數按預期執行,除了打印NULL以及預期的結果。爲什麼打印NULL

#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) 

這會產生這樣的輸出:

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. 

爲什麼其打印NULL?

+0

只是FYI,你可以通過'sum(is.na(data $ column))獲得一列中缺失值的數量' – adibender

+0

這可能是因爲你的函數實際上並沒有返回任何值,它只是告訴R打印在那種情況下。定義函數時可能嘗試執行'return'命令? – cgage

+0

夫婦的事情:首先我注意到(is.na(data $ ri [i] == TRUE))正在檢查值是否爲真然後檢查它的NA。你的括號不匹配。其次,正如我之前提到的那樣,你可以在一行中完成。 – Marsenau

回答

4

NULL被打印,因爲這是返回值cat函數。 您不需要printcat

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

在你的情況cat打印有關缺失值的信息,然後print打印由cat返回的值,這是NULL

FYI:您可以讓這個更有效,例如:

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

或者,只需使用'paste'而不是'cat',並且不會看到NULL打印輸出。 – giraffehere

+0

謝謝你的幫助>我非常感謝它。 – user2502904

+0

@ user2502904歡迎您,不要忘記接受對您有幫助的答案(同樣在之前提出的問題中) – adibender

1

@adibender正確回答了這個問題。

只是這樣做:

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

或者這樣:

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

而且,我只是想做出說明,因爲你是新的功能。當您編寫函數myFun時,您正在爲變量設置默認情況。

因此,當您將函數實例化爲function(ri = ri, ni = ni, data = data)時,您告訴R,如果用戶在函數調用中遺漏了ri,ni和/或數據,請使用ri,ni和/或數據。除非你已經在其他地方實例化了ri,ni或其他數據,否則這對於函數並沒有什麼意義。

取而代之,您可以將函數編寫爲function(ri, ni, data),如果使用這些參數,R將拋出錯誤。