Либо / Или-Аргументы в функциях R - PullRequest
2 голосов
/ 29 марта 2012

Я все еще новичок в написании функции в R.

Я пытаюсь написать функцию, которая требует: ЛИБО аргумент "a", ИЛИ аргументы "b" и "c" вместе.

Кроме того, эта функция имеет несколько аргументов со значениями по умолчанию.

Как лучше всего обрабатывать аргументы либо /, либо -.Если указано «a», мне не нужны «b» и «c», и наоборот, но необходим хотя бы один.

Кроме того, «a» - это строка (фрукты, такие как «Apple», «Груша и т. Д.), А «б» и «с» - значения.На заднем плане есть информационная рамка, где для каждого плода определены значения "b" и "c".Поэтому для использования функции потребуется либо действительный фрукт (аргумент «a»), либо сами значения «b» и «c».

Функция, с которой я начал:

f <- function(a,b,c,d=1,e=2)

Ответы [ 3 ]

3 голосов
/ 29 марта 2012
 dfrm <- data.frame(a=LETTERS[1:3], 
        b=letters[1:3], 
        c=letters[5:7], 
        res=c("one", "two", "three") )
 dfrm
#
  a b c   res
1 A a e   one
2 B b f   two
3 C c g three

 f <- function(a=NA,b=NA,c=NA,d=1,e=2){ 
                if ( is.na(a) & (is.na(b) | is.na(c) ) ) {stop()}
                if (!is.na(a) ) { dfrm[dfrm[[1]]==a, ] 
                       # returns rows where 1st col equals `a`-value
                                   } else {
                                     dfrm[ dfrm[[2]]==b & dfrm[[3]] == c , ]
                       #returns rows where 2nd and 3rd cols match `b` and `c` vals
                                           }
 }
 f("A")
#
  a b c res
1 A a e one

 f(b="a", c="e")
#
  a b c res
1 A a e one

 f()
#Error in f() : 

Я думаю, что могут быть некоторые непроверенные крайние случаи, но на самом деле ответственность за обеспечение соответствующими материалами тестирования лежит на самом деле, и @Johannes даже не предоставил простую структуру тестовых данных, а тем более набор крайних случаев.

1 голос
/ 29 марта 2012

Функция missing должна помочь:

f <- function(a,b,c,d=1,e=2) {
     if (missing(a)) {
         # use b and c
         b+c # you'll get an error here if b or c wasn't specified
     } else {
         # use a
         nchar(a)
     }
}

f('foo')    # 3
f(b=2, c=4) # 6
f(d=3)      # Error in b + c : 'b' is missing
0 голосов
/ 29 марта 2012

Проверьте здесь определение polar () для хорошего, хотя и более простого примера:

http://blog.moertel.com/articles/2006/01/20/wondrous-oddities-rs-function-call-semantics

...