Я использую 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 выполнять все команды функции одновременно. Другие предложения приветствуются.