Как обращаться ... когда последний аргумент пуст - PullRequest
0 голосов
/ 30 августа 2018

При использовании ... для захвата дополнительных аргументов, оставляя последний аргумент пустым и попытка использовать list(...) приведет к ошибке

f <- function(x, ...) {
    args <- list(...)
}

f(x = 0, y = 10,)


> Error in f(x = 0, y = 10, ) : argument is missing, with no default

Здесь сообщение об ошибке по-прежнему информативно, но если вы передадите ..., вы получите следующее

f1 <- function(x, ...) {
    f2(x, ...)
}

f2 <- function(x, ...) {
    list(...)
}

f1(x = 0, y = 10,)

> Error in f2(x, ...) : argument is missing, with no default

Теперь очень становится совершенно неясно, что пошло не так. Существуют ли идиоматические методы, позволяющие зафиксировать ошибку и сообщить о ней с помощью полезного сообщения?

1 Ответ

0 голосов
/ 30 августа 2018
f <- function(x, ...) {
    return(
        as.list(substitute(list(...)))[-1]
    )
}

err <- f(x = 0, y = 10,)   #have a closer look --> str(err)

#$`y`
#[1] 10
# 
#[[2]]

fine<- f(x = 0, y = 10)

#$`y`
#[1] 10

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


Так что ваша значимая обработка ошибок может выглядеть так:

Спасибо @Roland за участие.

f <- function(x, ...) {
    res <- as.list(substitute(list(...)))[-1]
    if( any(  sapply(res, function(x) { is.symbol(x) && deparse(x) == "" })  ) )  stop('Please remove the the last/tailing comma "," from your input arguments.')
    print("code can run. Hurraa")
}

a <- 0; 
f(x = 0, y = a, hehe = "", "")
#[1] "code can run. Hurraa"

f(x = 0, y = a, hehe = "", "", NULL)
#[1] "code can run. Hurraa"

f(x = 0, y = a, hehe = "", "",)
#Error in f(x = 0, y = a, hehe = "", "", ) : 
#Please remove the the last/tailing comma "," from your input arguments.

f(x = 0, y = a, hehe = "", "", NULL,)
#Error in f(x = 0, y = a, hehe = "", "", NULL, ) : 
#Please remove the the last/tailing comma "," from your input arguments.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...