Есть ли способ заставить родительскую функцию возвращать вывод? Скажем, у меня есть функция, которая «что-то делает», и в начале каждой функции я хочу «что-то проверить». Если проверка не удалась, я хочу вернуть «что-то еще».
В моем примере ниже «что-то делает» — это логарифм, «проверка чего-то» означает проверку того, что переменная неотрицательна, а «что-то еще» равно минус бесконечности.
weird_log <- function(x) {
check(x)
log(x)
}
check <- function(x) {
if (x <= 0)
eval.parent(parse(text = 'return(-Inf)'))
}
Этот пример не работает
weird_log(10) # 2.302585
weird_log(-10) # NaN
Одно из решений состоит в том, чтобы возвращать «что-то еще» из функции проверки, если проверки обнаруживают проблему, и NULL
в противном случае. Затем я могу написать один if
в родительской функции, и все готово.
weird_log <- function(x) {
y <- check(x)
if (!is.null(y)) return(y)
log(x)
}
check <- function(x) {
if (x <= 0) {
-Inf
} else {
NULL
}
}
Это решение по-прежнему сохраняет большую часть функциональности в отдельной функции check()
, но есть ли способ сохранить в ней все функциональные возможности?
В реальной задаче функция проверки выполняет более одного сравнения и используется в нескольких функциях, поэтому ее необходимо иметь отдельно. Также «что-то еще», возвращающее функцию check
, зависит от условия, при котором ввод не выполняется.
Более реалистичный пример:
weird_log <- function(input) {
y <- check(input)
if (!is.null(y)) return(y)
list(log = log(input$x))
}
check <- function(input) {
if (is.null(input$x)) {
list(error = 'x is missing')
} else if (!is.numeric(input$x)) {
list(error = 'x is not numeric')
} else if (x <= 0) {
list(log = -Inf, warn = 'x is not positive')
} else {
NULL
}
}
parse(text = 'return(-Inf)')
там. Развеeval.parent(return(-Inf))
не сделает то же самое? Я не знаю, где вы, ребята, этому научились, но это действительно плохая практика написания кода. - person Rich Scriven   schedule 17.03.2017