Я пытаюсь найти глобальный аналог isdebugged()
в R. Мой сценарий состоит в том, что у меня есть функции, которые выполняют вызовы других функций, все из которых я написал, и я включаю и выключаю debug()
для разных функций во время моей отладки.Однако я могу потерять отслеживание того, какие функции настроены для отладки.Когда я забываю и запускаю цикл, я могу получить намного больше выходных данных (неприятно, но не ужасно), либо я могу не получить выходных данных, когда некоторые из них желательны (плохие).
Мой текущий подход заключается в использовании функциианалогично приведенному ниже, и я могу вызвать его с помощью listDebugged(ls())
или перечислить элементы в загруженной библиотеке (примеры ниже).Этого может быть достаточно, но для этого необходимо, чтобы я вызывал его со списком всех функций в рабочей области или в загруженных пакетах.Я могу обернуть другую функцию, которая получает это.Кажется, что должен быть более простой способ просто напрямую «задавать» функцию отладки или запрашивать какую-то непонятную часть среды, в которой она хранит список функций с установленным флагом отладки.
Итак,вопрос из двух частей:
- Существует ли более простой вызов для запроса функций с установленным флагом отладки?
- Если нет, то есть ли какая-то хитрость, которую я пропустил?Например, если функция в одном пакете маскирует другой, я подозреваю, что могу вернуть вводящий в заблуждение результат.
Я понимаю, что есть другой метод, который я мог бы попробовать, и это обернуть debug
и undebug
внутри функций, которые также поддерживают скрытый список имен отлаженных функций.Я еще не уверен, что это безопасная вещь.
ОБНОВЛЕНИЕ (8/5/11): я искал SO и не нашел более ранних вопросов.Тем не менее, список «связанных вопросов» SO показал, что более ранний вопрос, похожий на , хотя функция в ответе на этот вопрос более многословна и медленнее, чем функция, предлагаемая @cbeleites.Старый вопрос также не предоставляет никакого кода, в то время как я сделал.:)
код:
listDebugged <- function(items){
isFunction <- vector(length = length(items))
isDebugged <- vector(length = length(items))
for(ix in seq_along(items)){
isFunction[ix] <- is.function(eval(parse(text = items[ix])))
}
for(ix in which(isFunction == 1)){
isDebugged[ix] <- isdebugged(eval(parse(text = items[ix])))
}
names(isDebugged) <- items
return(isDebugged)
}
# Example usage
listDebugged(ls())
library(MASS)
debug(write.matrix)
listDebugged(ls("package:MASS"))