Список функций с флагом отладки, установленным в R

Я пытаюсь найти глобальный аналог isdebugged () в R. Мой сценарий заключается в том, что у меня есть функции, которые вызывают другие функции, все из которых я написал, и я включаю и выключаю debug () для различных функций во время отладки. Однако я могу потерять представление о том, какие функции должны быть отлажены. Когда я забываю и запускаю цикл, я могу получить намного больше результатов (неприятно, но не ужасно) или я могу не получить результат, когда что-то желательно (плохо).

Мой текущий подход заключается в использовании функции, аналогичной функции один ниже, и я могу вызвать его с помощью listDebugged (ls ()) или перечислить элементы в загруженной библиотеке (примеры ниже). Этого может быть достаточно, но для этого требуется, чтобы я вызывал его со списком всех функций в рабочей области или в загруженных пакетах. Я могу обернуть другую функцию, которая их получает. Похоже, что должен быть более простой способ просто напрямую «запросить» функцию отладки или запросить какую-то неясную часть среды, в которой хранится список функций с установленным флагом отладки.

Итак, вопрос из двух частей. :

  1. Существует ли более простой вызов для запроса функций с установленным флагом отладки?
  2. Если нет, то есть ли какие-нибудь уловки, которые я упустил? Например, если функция в одном пакете маскирует другой, я подозреваю, что могу вернуть вводящий в заблуждение результат.

Я понимаю, что есть еще один метод, который я мог бы попробовать, а именно обернуть 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"))

13
задан Community 23 May 2017 в 12:31
поделиться