Я хочу изменить поведение печати консоли в функции R, чтобы вернуть то же поведение, что и в глобальной среде.
Несмотря на то, что вы можете вызвать browser()
, чтобы войти в среду функций и получить доступ к локальным переменным, я просто хочу получить выражения для вывода на консоль.
Цель состоит в том, чтобы иметь гибкий ибыстрый способ оценить множество (десятки) выражений для проверки кода и понимания статистических свойств промежуточного вывода.Я хочу сделать это на лету, без необходимости входить в функцию с помощью отладчика, поскольку это требует дополнительного ручного управления, а также без необходимости записывать избыточные операторы, такие как print("x^2"); print(x^2)
, что я мог бы сделать, но позже впроцесс разработки кода для более постоянных проверок кода.
Я имею в виду следующее: напишите функцию log.to.console()
, чтобы получилось следующее:
myfunlog = function(x){
log.to.console()
a1 = sqrt(x)
a2 = exp(x)
a1;a2;log(x);x^2
return(a1*a2)
}
ans = myfunlog(2)
[1] a1
[1] 1.414214
[1] a2
[1] 7.389056
[1] log(x)
[1] 0.6931472
[1] x^2
[1] 4
У меня есть решение, котороеэто не совсем то, что я искал, но, благодаря продвинутым R-страницам Хэдли для выражений и областей видимости, я разработал эту функцию:
print.to.console = function(...){
dots = pryr::named_dots(...)
p = parent.frame()
for( dot in dots){
print(dot)
print(eval(dot, envir = p))
}
}
myfunprint = function(x){
a1 = sqrt(x)
a2 = exp(x)
print.to.console(
a1, a2, log(x), x^2
)
return(a1*a2)
}
ans = myfunprint(2)
# Which gives the output I want:
a1
[1] 1.414214
a2
[1] 7.389056
log(x)
[1] 0.6931472
x^2
[1] 4
Обновление: теперь я могу вызывать это с помощью явной области видимости только с одной функциейзвоните, тогда как раньше я должен был использовать environment(print.to.console) = environment()
в myfunprint()
.Однако я все же предпочел бы выяснить, как реализовать функциональность log.to.console()
, описанную выше.Есть идеи?