Подтвердить что ты не робот

В чем разница между финишем и продолжением в браузере()?

В файле справки для browser есть два варианта, которые кажутся очень похожими:

f

завершить выполнение текущего цикла или функции

c

выйти из браузера и продолжить выполнение в следующем операторе.

В чем разница между ними и в каких ситуациях разница очевидна?

Некоторые подсказки о том, что может быть разницей - я написал script под названием browse.R со следующим содержимым:

for (i in 1:2){
  browser()
  print(i)
}

Это результаты использования c vs f:

> source("browse.R")
Called from: eval(expr, envir, enclos)
Browse[1]> c
[1] 1
Called from: eval(expr, envir, enclos)
Browse[1]> c
[1] 2
> source("browse.R")
Called from: eval(expr, envir, enclos)
Browse[1]> f
[1] 1
Browse[2]> f
[1] 2

Обратите внимание, что уровень Browse[n] изменяется. Это все еще не подчеркивает каких-либо практических различий между ними.

Я также попытался выяснить, исчезли бы вещи из среды браузера:

for (i in 1:2){
  a <- "not modified"
  browser()
  print(a)
}

Called from: top level 
Browse[1]> a <- "modified"
Browse[1]> f
[1] "modified"
Browse[1]> a
[1] "not modified"
Browse[1]> a <- "modified"
Browse[1]> c
[1] "modified"

Таким образом, нет никакой разницы.

4b9b3361

Ответ 1

Есть небольшая разница.

  • c немедленно выходит из браузера (и режим отладки), а после этого выполняет остальную часть кода обычным способом.
  • f напротив, остается в браузере (и режиме отладки) при выполнении остальной части функции/цикла. После завершения функции/цикла он также возвращается в нормальный режим выполнения.

Источник: R-source (строка 1105-1117) и R-помощь

Это имеет несколько последствий:

  • c закрывает браузер. Это означает, что из функции вызывается новый вызов браузера. Поэтому вы увидите строку: Called from: function(). f, с другой стороны, не закроет браузер, и поэтому вы не увидите эту строку. Исходный код для этого поведения находится здесь: https://github.com/wch/r-source/....
  • Поскольку f остается в браузере, f также отслеживает контекстный уровень:

Приглашение браузера имеет вид Browse [n] > : здесь var {n} указывает на уровень браузера. Браузер можно вызывать при просмотре (и часто при использовании отладки), и каждый рекурсивный вызов увеличивает число. (Фактическое число - это число "контекстов" в стеке контекста: обычно это 2 для внешнего уровня просмотра и 1 при проверке дампов в отладчике)

Эти различия можно проверить с помощью кода:

> test <- function(){
      browser()
      browser()
  }

> test()
Called from: test()
Browse[1]> c
Called from: test()
Browse[1]> c

> test()
Called from: test()
Browse[1]> f
Browse[2]> f

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

Ответ 2

Разница между браузером и продолжением

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

Функция browser является основой большинства методов отладки R. По сути, вызов browser останавливает выполнение и запускает специальный интерактивный сеанс, в котором вы можете проверить текущее состояние вычислений и выполнить команду по одному коду за раз.

В браузере вы можете выполнить любую команду R. Например, можно просмотреть локальную среду, используя ls(); или выберите новые переменные или измените значения, присвоенные переменным, просто используя стандартные методы для присвоения значений переменным. Браузер также понимает небольшой набор команды. Это приводит нас к обсуждению Готово и продолжить...

Тонкость по отношению к Готово и продолжить заключается в следующем:

  • Готово или f: завершает выполнение текущего цикла или функции.
  • Продолжить, c: отключение интерактивной отладки и продолжение выполнение функции. Это полезно, если вы исправили плохое и убедитесь, что функция работает правильно.

в основном, мы говорим о тонкости в режиме.

введите описание изображения здесь

Обзор браузера/восстановления

По крайней мере, для меня это нужно рассматривать в контексте отладки программы, написанной в R. В частности, как вы можете применить Готово и продолжить. Я уверен, что многие это понимают, но я включаю для полноты, поскольку лично я действительно не долгое время.

  • browser позволяет вам просматривать объекты в функции, в которой помещается вызов браузера.
  • recover позволяет вам просматривать эти объекты, а также объекты в вызывающей стороне этой функции и всех других активных функциях.

Либеральное использование browser, recover, cat и print во время написания функций позволяет свести ваши ожидания и ожидания R.

Очень удобный способ сделать это с помощью трассировки. Например, если просмотр конец функции myFun удобен, вы можете сделать:

trace(myFun, exit=quote(browser()))

Вы можете настроить трассировку с помощью команды, например:

trace(myFun, edit=TRUE)

Если вы столкнулись с ошибкой, то отладка будет подходящим действием. Есть минимум два подхода к отладке. Первый подход - посмотреть на состояние играйте в точке, где происходит ошибка. Подготовьтесь к этому, установив ошибку вариант. Два наиболее вероятных варианта:

options(error=recover)

или

options(error=dump.frames)

Разница в том, что при recover вы автоматически включаетесь в отладку mode, но с dump.frames вы начинаете отладку, выполняя:

debugger()

В любом случае вам предоставляется выборка кадров (сред) активных функций для проверки.

Вы можете заставить R обрабатывать предупреждения как ошибки с помощью команды:

options(warn=2)

Если вы хотите установить параметр ошибки в своей функции .First, вам понадобится т. к. не все выполняется на момент выполнения .First:

options(error=expression(recover()))

или

options(error=expression(dump.frames()))

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

debug(myfun)

а затем выполните оператор, включающий myfun. Когда вы закончите отладку, сделать:

undebug(myfun)

Более сложная версия такого рода отладки может быть найдена в отладочный пакет.

Ссылки:

  • R Inferno
  • R Программирование для биоинформатики
    • Автор: Robert Gentleman

Ответ 3

Вы можете думать о finish как break на других языках. Случается, что вы больше не заботитесь о других элементах на итерации из-за определенного состояния, такого как поиск определенного элемента или элемента, который может вызвать ошибку.

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