есть ли способ узнать, какие имена получили бы значения "...", если бы я использовал их с заданной функцией? - PullRequest
1 голос
/ 18 июня 2020
    other.function <- function( x, y ) {

    }

    my.function <- function( ... ) {

        the.args <- figure.it.out( other.function, ... )

    }

    my.function(   1, 2 ) ## the.args would now be: list( x=1, y=2 )
    my.function( y=1, 3 ) ## the.args would now be: list( x=3, y=1 )

Есть ли способ выяснить, какая часть ... будет применима к данной другой функции, и в форме списка, какие имена у них будут в конечном итоге?

Это должно быть также иметь возможность делать правильные вещи , если other.function принимает ... (не описано выше).

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Обычно лучше всего хранить ... аргументов в списке, а затем обращаться к ним с использованием имен аргументов. Это похоже на то, что вы видите в **kwargs в python. Например:

f1 = function(x,y){
}

f2 = function(...){
    arguments = list(...)
    do.something = f1(x=argumetns$x, y = arguments$y)
}

Конечно, недостатком этого является то, что не совсем понятно, с какими именами следует передавать аргументы. Один из способов решить эту проблему - предоставить исчерпывающую документацию, иначе вы можете проверить, что аргументы были переданы перед выполнением функции.

Например, вы можете убедиться, что пользователь передал аргумент x, прежде чем делать вызов функции выглядит примерно так:

f2 = function(...){
    arguments = list(...)
    if(is.null(arguments$x) || is.null(arguments$y)){
        stop('f2 missing the value for argument x or y')
    } #this will halt the execution and alert the user of missing x or y argument

    do.something = f1(x = arguments$x, y = arguments$y)
}

Я обнаружил, что использование is.null() для проверки отсутствующих аргументов очень полезно. Если пользователь не предоставил конкретный аргумент, скажем x, то is.null(arguments$x) вернет TRUE.

1 голос
/ 18 июня 2020

Это то, что вы ожидаете:


other.function <- function(x,y) {}

my.function <- function( ..., other.function ) {
  argsin <- list(...)
  argsfn <- formalArgs(other.function)
  # Unknown arguments
  unknown <- setdiff(names(argsin),argsfn)
  if(any(unknown!="")) {stop(paste("wrong argument(s):",unknown[unknown!=""]))}
  common.args <- intersect(names(argsin),argsfn)
  other.args <- setdiff(argsfn,names(argsin))
  # Recognised arguments
  l <- argsin[common.args]
  argsin[common.args]<-NULL
  # Other arguments
  names(argsin) <- other.args
  as.list(unlist(list(l,argsin)))
}

my.function(   1, 2,other.function = other.function ) ## the.args would now be: list( x=1, y=2 )
$x
[1] 1

$y
[1] 2

my.function( y =1, 3,other.function = other.function ) ## the.args would now be: list( x=3, y=1 )

$y
[1] 1

$x
[1] 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...