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