2014-12-28 2 views
1

Я хотел бы создать функцию, которая сначала проверяет, чтобы аргументы, переданные этой функции, были действительны. Моя конкретная функция принимает два аргумента, и мне удалось проверить правильность первого аргумента. Однако проверка второго аргумента дает мне проблемы.Проверка правильности аргументов функции в R

Я хотел бы проверить, что вход для state является членом state.abb. Кажется, это работает правильно.

Я также хочу проверить, что вход для outcome является членом "heart attack", "heart failure", "pneumonia". Это работает неправильно.

Вот мой код до сих пор:

best <- function(state, outcome){ 

    ## Read outcome data 

    outcome <- read.csv("outcome-of-care-measures.csv", colClasses = "character") 

    ## Check that state and outcome are valid 

    if (!any(state == state.abb)){ 
    stop("invalid state") 
    } 
    if (!any(outcome == c("heart attack", "heart failure", "pneumonia"))){ 
    stop("invalid outcome") 
    } 

    ## The function will do other things after this is sorted out. 

} 

Когда я вхожу неправильно состояния аббревиатуры функция дает мне правильную ошибку:

> best("FF", "heart failure") 
Error in best("FF", "heart failure") : invalid state 

Теперь, когда я вхожу в правильное состояния аббревиатура и неправильный результат, как представляется, дает мне правильную ошибку:

> best("CA", "this is wrong") 
Error in best("CA", "this is wrong") : invalid outcome 

Но эта же ошибка сохраняется даже тогда, когда у меня есть правильный аргумент для исхода:

> best("CA", "heart failure") 
Error in best("CA", "heart failure") : invalid outcome 

Может кто-нибудь дать мне удар в правильном направлении по сортировке проверки валидности второго аргумента?

Edit: Per lukeA «s комментарий представляется проблема может вытекать из команды read.csv. Теперь я включил эту команду в указанный выше код.

+2

Не воспроизводимо. 'best (" CA "," heart failure ")' здесь не вызывает ошибку, если 'CA' находится в' state.abb'. Совет. Вы также можете написать 'stopifnot (результат% в% c (« сердечный приступ »,« сердечная недостаточность »,« пневмония »)). – lukeA

+0

@ lukeA Вы совершенно правы. Я удалил команду 'read.csv' из исходного сообщения, так как не думал, что это имеет значение, но, похоже, это способствует этой проблеме. Означает ли это, что это помогает? –

+0

Что вы подразумеваете под "удалить"? Если вы не читаете в своих данных, как вы можете его обработать? Вы каким-то образом создали свои образцы данных, и если да, сделайте 'str' в обеих версиях. Скорее всего, где-то существует несоответствие класса, или, возможно, пробельный символ мешает. –

ответ

0

Я думаю, дело в том, что: второй аргумент «результат» присваивается содержимое файла CSV в соответствии с «исходом < - read.csv (» результат оказания медицинской помощи-measures.csv», colClasses = «character») « , поэтому результат не должен быть действительным :)

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