【发布时间】:2018-06-07 15:54:07
【问题描述】:
我想修改 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
我有一个不完全是我想要的解决方案,但是感谢 Hadley 用于表达式和范围界定的高级 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
更新:我现在可以只通过一个函数调用来显式地调用它,而之前我必须在myfunprint() 中使用environment(print.to.console) = environment()。但是,我还是想弄清楚如何实现上述log.to.console() 功能。有什么想法吗?
【问题讨论】:
-
print函数执行此操作。我不明白存在什么问题。你能举一个print无法向控制台输出输出的小例子吗? -
我希望表达式与输出一起打印,如帖子所示。这是因为在实际用例中,我们正在讨论几十个长表达式,我不想单独命名。我只想通过他们的表达调用来引用他们。我也不喜欢把 print 写两次,例如打印(“x^2”); print(x^2),所以每次我修改一个表达式我也必须修改字符串。如果我在
print中错过了这个功能,请解释一下。我仍然宁愿调用一个我可以调用一次的log.to.console()函数,就像我调用 browser() 函数一样。谢谢 -
如果将表达式定义为函数中的对象,则可以执行
all_vars = ls(); for (i in ls) {print(i); print(get(i))}之类的操作。这样的东西好吗? -
我很困惑你想要
log.to.console是什么,它与myfunlog有什么不同(这只是一个示例函数吗?)你想要多少是动态的?打印表达式,而不仅仅是对象,真的那么重要吗?为什么不直接将debug参数传递给您的函数,默认为debug = FALSE,并使用一些 if 语句来打印额外的内容,if(debug) {print.expressions.to.console()}。
标签: r console cat error-checking