【问题标题】:Either/Or-Arguments in R functionsR 函数中的非此即彼的参数
【发布时间】:2012-03-29 12:25:14
【问题描述】:

我在R中的写作功能还是新手。

我尝试编写一个需要: 要么是参数“a”,要么是参数“b”和“c”。

此外,这个函数还有一些带有默认值的参数。

我怎样才能最好地处理非此即彼的参数。如果提供了“a” 我不需要“b”和“c”,反之亦然,但至少需要一个。

此外,“a”是一个字符串(水果,如“Apple”、“Pear”等),而“b”和“c”是值。背景中有数据框,其中为每个水果定义了值“b”和“c”。因此,使用该函数需要一个有效的水果(参数“a”)或值“b”和“c”本身。

我开始使用的函数:

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

【问题讨论】:

  • 也许最简单的方法是将一些if(missing(a)){if(missing(b) | missing(c)) [do something useful]} 代码扔到函数的开头。重要说明:避免使用“c”作为变量名,因为它与内置的c() 函数冲突。

标签: r function arguments


【解决方案1】:
 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 甚至没有提供简单的测试数据结构,更不用说一组边缘案例了。

【讨论】:

  • 我凝视了一会儿,试图找出它不是自我记录的地方,并认为唯一可能的歧义是使用 dfrm[[n]] 来选择列。
  • 那是您的反对意见,那么我认为您并没有真正遵循 SO 准则。 Downvotes 用于不正确或无用的回复。如果您认为代码需要进一步解释,您可以向版主霸主报告仅代码答案。另一方面,没有对否决票的审查,只要您感到被冒犯或不妥,您就可以这样做。
【解决方案2】:

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

【讨论】:

  • @CarlWitthoft - 不,nchar(a) 仅在a缺失时执行。
【解决方案3】:

查看 polar() 的定义这里有一个很好但更简单的例子:

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

【讨论】:

  • 我刚刚更新了我的问题(见上文),因为我的论点不能像极地示例中那样通过简单的数学函数直接从一个转移到另一个。我的论点是字符串和值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多