Предположим, что у Вас есть следующая функция foo
. Когда я выполняю a for
цикл, я хотел бы, чтобы это пропустило остаток от foo
когда foo
первоначально возвращает значение 0
. Однако break
не работает, когда это в функции.
Как это в настоящее время пишется, я получаю сообщение об ошибке, no loop to break from, jumping to top level
.
Какие-либо предложения?
foo <- function(x) {
y <- x-2
if (y==0) {break} # how do I tell the for loop to skip this
z <- y + 100
z
}
for (i in 1:3) {
print(foo(i))
}
По общему признанию, мои знания R скудны, и это сухое кодирование, но должно работать что-то вроде следующего:
foo <- function(x) {
y <- x-2
if (y==0) {return(NULL)} # return NULL then check for it
z <- y + 100
z
}
for (i in 1:3) {
j <- foo(i)
if(is.null(j)) {break}
print(j)
}
Изменить: обновлена проверка нулевого значения для потомков
Можно ли нам проявить немного больше творчества? Не могли бы вы переделать свою проблему, чтобы воспользоваться следующим подходом, в котором операция основана на векторах?
x <- 1:3
y <- x[x-2 < 0] - 2 + 100 # I'm leaving the "- 2" separate to highlight the parallel to your code
y
Если, однако, в основе вопроса лежит более глубокая форма, и нам нужно следовать этому шаблону на данный момент, возможно, немного подправим его. ...
foo <- function(x) {
y <- x - 2
if (y != 0) {
z <- y + 100
z
} # else implicitly return value is NULL
}
for (i in 1:3) {
if (is.numeric(result <- foo(i))) {
print(result)
} else {
break
}
}
Альтернативный способ — выбросить ошибку и поймать ее с помощью try
, например:
foo <- function(x) {
y <- x-2
if (y==0) {stop("y==0")}
z <- y + 100
z
}
try(for (i in 0:5) {
print(foo(i))
}, silent=TRUE)
## or use tryCatch:
for (i in 0:5) {
bar <- tryCatch(foo(i),error=function(e) NA)
if(is.na(bar)){ break } else { print(bar) }
}
Не делайте этого с точки зрения практики кодирования. Наличие функции, которую можно использовать только внутри определенного цикла, - не лучшая идея. В качестве образовательного интереса вы можете оценить «разрыв» в родительской среде.
foo <- function(x) {
y <- x-2
if (y==0) {eval.parent(parse(text="break"),1)}
z <- y + 100
z
}
for (i in 0:3) {
print(foo(i))
}
Я понятия не имею, как работает r
, но мне показался интересным вопрос, потому что я мог найти синтаксис нового языка, поэтому извините за мой ответ, если он полностью неверен :)
foo <- function(x) {
y <- x-2
if (y!=0) z <- NULL else z <- y + 100
z
}
for (i in 1:3)
{
a <- foo(i)
if (a == NULL) {next}
print(a)
}