2014-10-06 7 views
0

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

Аргументы функции являются x, y и type, где x и y векторы Я хочу построить и type тип сюжета (разброс, коробки, или гистограммы).

Функция должна быть записана так, чтобы, если вы не указали данные для x с типом рассеяния, вы получите сообщение об ошибке, в котором говорится, что вам нужны данные x для создания диаграммы рассеяния.

Аналогичным образом, если вы укажете данные для x с гистограммой типа или коробкой, вы получите сообщение об ошибке, в котором вам понадобятся только данные y для этих типов графиков.

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

In if (y == FALSE & type == 1) { : 
    the condition has length > 1 and only the first element will be used 

Функция находится ниже. Может кто-нибудь сказать мне, почему я получаю это особое предупреждение?

plot.function2=function(x=FALSE,y=FALSE,type){ 
    if(x==FALSE & type==1){ 
    stop("Error Message 1") 
    }else if (y==FALSE & type==1){ 
    stop("Error Message 1.5") 
    }else if(type==1){ 
    plot=plot(y~x) 
    }else if (x==TRUE & type==2){ 
    stop("Error Message 2") 
    }else if(type==2){ 
    plot=boxplot(y) 
    }else if(type==3){ 
    plot=barplot(y) 
    } 

plot 
} 

Сообщение появляется для большинства входов; например, ввод plot.function2(v1, v2, 1) дает мне диаграмму рассеяния двух векторов, , а также предупреждение. Благодаря!

+1

Вложенное 'if' /' else' является болезненным для чтения. Посмотрите на функцию 'switch'. После этого переключателя вы можете переключаться в соответствии с типом и тестовым входом. – Roland

ответ

2

Вы сравниваете векторы и булевы своих функций.

# Here if you provide a vector x, you are essentially checking 
# if each element is TRUE, hence the warning 

    if(x==FALSE & type==1){ 
    stop("Error Message 1") 
    } 

В качестве примера см вектор из набора данных радужки

> iris[1:25,1] == TRUE 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Вы должны использовать NULL и is.null, чтобы увидеть, если объект пуст

plot.function2=function(x=NULL,y=NULL,type){ 
    if(is.null(x) & type==1){ 
    stop("Error Message 1") 
    }else if (is.null(y) & type==1){ 
    stop("Error Message 1.5") 
    }else if(type==1){ 
    plot=plot(y~x) 
    }else if (is.null(x) & type==2){ 
    stop("Error Message 2") 
    }else if(type==2){ 
    plot=boxplot(y) 
    }else if(type==3){ 
    plot=barplot(y) 
    } 
plot 
} 

Согласно предложению, это можно было бы очистить оператором switch, который, как вы можете видеть.

plot.function2=function(x=NULL,y=NULL,type){ 
    # check if nulls 
    if(is.null(y)){ 
    stop("You need to provide y data!!!") 
    } 
    if(is.null(x) & type == 1){ 
    stop("You need to provide x data!!!") 
    } 

    plot <- switch(as.character(type), 
       "1" = plot(y~x), 
       "2" = boxplot(y), 
       "3" = barplot(y)) 
    plot 
} 
+0

Вам не нужно 'is.null (x) == TRUE', просто' is.null (x) 'достаточно. – jlhoward

+0

@jlhoward, вы правы, обновлены. – cdeterman

+0

@ Kathryn, это решило вашу проблему? – cdeterman

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