4

私はRで作業しており、元の関数内で別の関数を呼び出すときに引数として使用できるように、引数を関数に渡す必要があります。以下の例では、primaryFunc() が呼び出されるたびに interiorFunc() を呼び出すことに関心があることがわかりますが、最初のパラメーターの値は 2 番目のパラメーターの存在に依存しています。「パラメータ 2」を宣言すると、関数呼び出しで「パラメータ 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)
}

関数呼び出しは次のいずれかになります。

interiorFuncResults <- primaryFunc(dataset, response, parameter1)

また

interiorFuncResults <- primaryFunc(dataset, response, parameter1, parameter2)

したがって、内部関数を呼び出す前に、'parameter2' 値が渡されたかどうかを判断する必要があります。この例を再現可能にするための interiorFunc() の定義を次に示します。

ご協力ありがとうございました。

4

1 に答える 1

2

一般的な戦略の1つは、名前をフィルタリングすることだと思います。

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)

...もちろん、完全な名前の引数のみを受け取ることを前提としています。

于 2013-05-19T23:41:08.343 に答える