У меня есть функция, которая требует, чтобы я установил параметр, а именно stringsAsFactors=FALSE. Мой слишком распространенный подход заключался в том, чтобы сохранить существующее значение в начале функции.

op <- option("stringsAsFactors")

И прежде чем звонить return(x), обязательно позвоните

options(op)

Хотя это работает, это длинная и сложная функция, которая может возвращаться из нескольких мест, поэтому мне нужно либо убедиться, что каждому return(x) предшествует options(op), либо создать крошечную функцию (сама внутри моей функции) что делает только это:

returnfunc <- function(x) { options(op) return(x) }

Итак, мой вопрос: что было бы лучше сделать? В частности, такой, который предотвратил бы выход из функции с ошибкой и оставил параметр (неоправданно) измененным?

8
Dominic Comtois 9 Авг 2014 в 08:48

2 ответа

Лучший ответ

Именно это и делает встроенная функция on.exit. Например

f<-function() {
    op <- options(stringsAsFactors=FALSE)
    on.exit(options(op))

    read.table(...)
}

Вы можете изменить любые параметры, которые хотите, в вызове options(), и он возвращает все значения до изменений в виде списка, поэтому его легко сбросить. Вы можете передать любое выражение, которое захотите, в on.exit, здесь мы просто вернули параметры обратно к прежним значениям. Это будет выполняться при выходе из функции. См. ?on.exit для получения дополнительной информации.

13
MrFlick 9 Авг 2014 в 04:54

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

Например,

f <- function(x, stringsAsFactors = FALSE) {

        read.csv(..., stringsAsFactors = stringsAsFactors)

}

Таким образом, вы можете изменить его на TRUE, если хотите, и никакие options() не будут изменены. Вы действительно не хотите возиться с options() внутри функций.

1
Rich Scriven 9 Авг 2014 в 05:22