下面我创建一个名为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?
答案 0 :(得分:4)
NULL
,因为这是cat
函数的返回值。
您不需要print
和cat
。
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将抛出错误。