2016-03-21 2 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 (данные $ ri [i] == TRUE)) проверяет, истинно ли значение THEN, проверяя, является ли его NA. Ваши скобки не совпадают. Второе, что вы делаете, как упоминалось выше, может быть сделано в одной строке. – Marsenau

ответ

4

NULL напечатан как это возвращаемое значение cat функция. Вам не нужны print и cat.

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 выдает ошибку, если использование оставляет эти аргументы.

Смежные вопросы