убегая для цикла при выполнении функции в для цикла в R

Предположим, что у Вас есть следующая функция 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))
}
8
задан isomorphismes 13 November 2011 в 07:11
поделиться

5 ответов

По общему признанию, мои знания 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)
}

Изменить: обновлена ​​проверка нулевого значения для потомков

7
ответ дан 5 December 2019 в 10:02
поделиться

Можно ли нам проявить немного больше творчества? Не могли бы вы переделать свою проблему, чтобы воспользоваться следующим подходом, в котором операция основана на векторах?

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 
  }
}
4
ответ дан 5 December 2019 в 10:02
поделиться

Альтернативный способ — выбросить ошибку и поймать ее с помощью 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) }
}
2
ответ дан 5 December 2019 в 10:02
поделиться

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

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))
}
4
ответ дан 5 December 2019 в 10:02
поделиться

Я понятия не имею, как работает 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)
}
0
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: