函数输出中的NULL来自哪里?

时间:2016-03-21 17:24:44

标签: r function

下面我创建一个名为c_data的数据框。请注意,变量ri有一个缺失值。

然后我写了一个检查数据的函数。如果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?

2 个答案:

答案 0 :(得分:4)

打印

NULL,因为这是cat函数的返回值。 您不需要printcat

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

在您的情况下,cat打印有关缺失值的信息,然后print打印cat返回的值,即NULL

仅供参考:您可以提高效率,例如:

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

答案 1 :(得分: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将抛出错误。