Я пытаюсь найти глобальный аналог isdebugged()
в R. Мой сценарий заключается в том, что у меня есть функции, которые вызывают вызовы для других функций, все из которых я написал, и я включаю и выключаю debug()
для различных функций во время моей отладки. Однако я могу потерять информацию о том, какие функции установлены для отладки. Когда я забываю и начинаю цикл, я могу получить намного больше результатов (неприятность, но не страшная), или я не могу получить результат, когда кто-то желателен (плохой).
Мой текущий подход заключается в использовании функции, аналогичной приведенной ниже, и я могу вызвать ее с помощью listDebugged(ls())
или перечислить элементы в загруженной библиотеке (примеры ниже). Этого может быть достаточно, но для этого требуется, чтобы я вызывал его со списком каждой функции в рабочей области или в загружаемых пакетах. Я могу обернуть другую функцию, которая их получит. Похоже, что должен быть более простой способ просто "спросить" функцию отладки или запросить некоторую неясную часть среды, в которой он запустил список функций с установленным флагом отладки.
Итак, вопрос из двух частей:
- Существует ли более простой вызов для запроса функций с установленным флагом отладки?
- Если нет, то есть ли какая-то хитрость, которую я забыл? Например, если функция в одном пакете маскирует другую, я подозреваю, что могу вернуть неверный результат.
Я понимаю, что есть еще один метод, который я мог бы попробовать, и это обернуть debug
и undebug
в функции, которые также поддерживают скрытый список отлаженных имен функций. Я еще не убежден, что это безопасно.
UPDATE (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"))