当内部函数参数依赖于可选参数时,在R中传递参数

当内部函数参数依赖于可选参数时,在R中传递参数,r,function,parameters,parameter-passing,optional-parameters,R,Function,Parameters,Parameter Passing,Optional Parameters,我在R中工作,需要将参数传递给函数,以便在调用原始函数中的另一个函数时可以将它们用作参数。在下面的示例中,您可以看到我对每次调用primaryFunc()时调用interiorFunc()感兴趣,但第一个参数的值取决于第二个参数的存在。如果我在函数调用中声明'parameter 2',那么我需要一组不同于未声明'parameter 2'的参数。以下是内部功能的定义: interiorFunc(data, resp, param1, param2) { if(missing(param2))

我在R中工作,需要将参数传递给函数,以便在调用原始函数中的另一个函数时可以将它们用作参数。在下面的示例中,您可以看到我对每次调用primaryFunc()时调用interiorFunc()感兴趣,但第一个参数的值取决于第二个参数的存在。如果我在函数调用中声明'parameter 2',那么我需要一组不同于未声明'parameter 2'的参数。以下是内部功能的定义:

interiorFunc(data, resp, param1, param2)
{
  if(missing(param2)) 
  { 
    print(paste("Do analysis without parameter 2 on dataset of size",nrow(data),"with response",resp)
  }else{
    print(paste("Do analysis with parameter 2 on dataset of size",nrow(data),"with response",resp))
  }

}
下面是调用它的函数:

primaryFunc <- function(dataset, ...)
{
  if(parameter 2 has been declared in the call to primaryFunc)
  {
    results <- interiorFunc(dataset, ...)
  }else{
    modifedData <- sample(dataset, 2*dataset, replace = TRUE)
    results <- interiorFunc(modifiedData, ...)
  }

  return(results)
}

primaryFunc我认为常用的策略之一是过滤名称

sub <- function(x, y, param=NULL, ...){
  if(!is.null(param))
    message(param, "is being used") else
      message("not seeing it")
}

main <- function(a=1, b=2, ..., c=3){

  dots <- list(...)

  if("param" %in% names(dots))
    sub(a, b, ...) else
      sub(a, b, ...)

}

main(z=2)

main(param = 2)

sub就目前的问题而言,您可以简单地测试传递了多少额外的参数,如
length(list(…)
感谢您的回复。我想我应该让我的可复制的例子更现实一些。interiorFunc()实际上需要很多参数(大约10个),大约6个是可选的,但只有一个参数具有本例中参数2的效果,所有其他参数都可以在不影响primaryFunc()的情况下指定。我认为这是:)更常见的方法是将
param=NULL
作为
main
的参数,使用
if(is.null(param))
,并显式传递它;让我们称之为处理从
提取特定参数的更常见方法
interiorFuncResults <- primaryFunc(dataset, response, parameter1, parameter2)
sub <- function(x, y, param=NULL, ...){
  if(!is.null(param))
    message(param, "is being used") else
      message("not seeing it")
}

main <- function(a=1, b=2, ..., c=3){

  dots <- list(...)

  if("param" %in% names(dots))
    sub(a, b, ...) else
      sub(a, b, ...)

}

main(z=2)

main(param = 2)