使用R为单个参数创建具有多个名称的函数

时间:2018-07-29 03:32:58

标签: r

例如,我希望s OR sd OR sigma的参数表示相同的事物。

upper = function(mean, sigma, s, sd) {
    s = sd = sigma
    value = mean + 2 * sigma
    return(value)
}

我希望upper(mean = 0, sd = 1)upper(mean = 0, sigma = 1)给我相同的结果。

3 个答案:

答案 0 :(得分:2)

一个选择是保持函数签名不变,然后在内部检查<div class="center"> <file-drop headertext="Drop files here" (onFileDrop)="dropped($event)"> </file-drop> </div> <ng-container *ngIf="files?.length > 0"> <hello *ngFor="let file of files" [file]="file"></hello> </ng-container> sigmas中第一个定义的参数。我们可以在此处使用sd来解决此问题:

missing

Demo

但是总的来说,我想知道为什么您认为您需要此功能。公开一个接口然后期望您的函数以某种方式被调用并没有错。

答案 1 :(得分:1)

您可以匹配参数。即match.arg以便能够从函数中选择所需的参数:

upper=function(mean,sd,...){
  a = match.call()
  sd = a[[match.arg(names(a),c("sd","sigma","sig"),several.ok = T)]]
  value = mean + 2 * sd
  return(value)
}

print(upper(mean=0, sigma=2))  # 4
print(upper(mean=0, s=2))      # 4
print(upper(mean=0, sd=2))     # 4

答案 2 :(得分:0)

这是另一种选择:

fx <- function(x, sigma, ...) {
    sigma <- unlist(as.list(match.call())[c('sigma', 's', 'sd')])[1]
    return(sigma)
    }

c(fx(0, 1),
  fx(0, sigma=1),
  fx(0, s=2),
  fx(0, sd=3),
  fx(0, sd=3, s=2),
  fx(0, sd=3, s=2, sigma=1),
  fx(0, sig=1)
  )

# sigma sigma sigma    sd sigma sigma sigma 
#    1     1     2     3     2     1     1 

请注意,“ s =”始终被视为“ sigma =”的缩写,因此可以从函数的第二行中删除,即unlist(as.list(match.call())[ c('sigma','sd')])[1]。

但是,如果同时提供了“ s =“和“ sigma =”,则后者优先(请参见上面的第二个测试)。

还要注意,已命名为“ sigma”,因此,如果需要,该函数可以检查并响应其来源。

仅使用“ fx(0)”,“ sigma”为NULL,可以轻松对其进行测试,并在需要时返回有意义的错误消息。