объединение do.call () и debug () выводит все содержимое аргументов - PullRequest
1 голос
/ 16 июня 2020

Я использую R и пытаюсь отладить функцию, которую для удобства вызываю с помощью do.call().

Совмещение do.call() и browser() проблематично c. По сути, все элементы списка аргументов, переданных в do.call(), являются напечатанными , что, если список содержит, например, очень большую таблицу данных, не является устойчивым.

Вот представ. Я создаю простую функцию getsum(), которая суммирует элементы вектора. Я создаю функцию func(), которая вызывает getsum() для списка векторов.

#getsum returns the sum of a vector's elements 
#func returns the vector of the sum of a list of vectors


func <- function(vec_list){
    browser()
    sums = lapply(FUN=getsum, X=vec_list)
    sum = unlist(sums)
    return(sum)
}

getsum <- function(vec){
    sum = sum(vec)
    return(sum)
}


args = list(vec_list=list(rnorm(5), rnorm(5)))

do.call(func, args)

Вот результат, который я получаю:

Called from: (function(vec_list){
    browser()
    sums = lapply(FUN=getsum, X=vec_list)
    sum = unlist(sums)
    return(sum)
})(vec_list = list(c(-0.0801864335418185, 0.448324209935905, 
-2.86518616779484, -0.359284963520417, -0.620062639582574), c(1.74835180362954, 
-0.904288222154223, 0.746007117029027, 0.625889703799832, -0.908748727897187
)))
Browse[1]> 

Кто-то может сказать мне: «Почему вы используете do.call()?». Действительно, если я просто вызываю функцию сам, проблемы не возникает (см. Ниже). В этом примере мне не нужно использовать do.call(), но иногда это очень удобно.

#instead of do.call() use : 
func(vec_list=args$vec_list)

Результат:

Called from: func(vec_list = args$vec_list)
Browse[1]> 

РЕДАКТИРОВАТЬ:

Я пробовал аргумент browser(skipCalls=TRUE), который решает проблему, но бросает вызов цели browser(). Это заставляет R выполнять все команды функции одновременно. Другие предложения приветствуются.

...