我想修改R函数中控制台打印的行为,以恢复与全局环境中相同的行为。
就像你可以调用Regex reg = new Regex(@"SUMA (?<capture>\d+,\d+)");
Match match = reg.Match("Ł9CZIA KUOTA PIV 1,21 SUMA 12,36 otóuka 2 | 0350 |tKasa 1");
if (match.Success)
{
//12,36
Console.WriteLine(match.Groups["capture"].Value);
}
进入函数环境并访问局部变量一样,我只想让表达式打印到控制台。
目标是有一种灵活而快速的方法来评估许多(几十个)表达式,用于代码检查和理解中间输出的统计属性。我希望动态地执行此操作,而无需使用调试器进入该功能,因为这需要额外的手动控制,而且不必写出browser()
这样的冗余语句,我可能会这样做,但稍后在代码开发过程中进行更长期的代码检查。
我想到的是:编写一个函数print("x^2"); print(x^2)
,以便输出以下内容:
log.to.console()
我有一个解决方案,这不是我想要的,但是,感谢Hadley的高级R页面表达和范围我想出了这个功能:
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
更新:我现在可以使用只有一个函数调用的显式范围来调用它,而之前我必须在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()
功能。有什么想法吗?
答案 0 :(得分:3)
我建议使用字符标签和值构建命名列表
prtplus <- function(...){ dots <- substitute(list(...))[-1]
anames <- sapply(dots, deparse); setNames( list(...), anames) }
来自globalenv()
我附近有一些其他常数。
print( prtplus( p.lh, p.ml, p.hm) )
$p.lh
[1] 0.1
$p.ml
[1] 0.3
$p.hm
[1] 0.5
来自print
的{{1}}是多余的,但在函数中需要它:
globalenv()
您还可以将myfunlog = function(x){
a1 = sqrt(x)
a2 = exp(x)
print( prtplus(
a1, a2, log(x), x^2
))
return(a1*a2)
}
ans = myfunlog(2)
$a1
[1] 1.414214
$a2
[1] 7.389056
$`log(x)`
[1] 0.6931472
$`x^2`
[1] 4
构建为print
:
prtplus
如果您不喜欢带有反标题名称的R列表的打印表示,那么这将完全给出所请求的“外观”:
prtplus <- function(...){ dots <- substitute(list(...))[-1]
anames <- sapply(dots, deparse); print(setNames( list(...), anames)) }
答案 1 :(得分:0)
要强制打印命令打印到控制台,只需使用: 打印(con=stdout(),“我的文字”)
当心: 如果您之前在前一个语句中指定了连接“con”,例如 readLines(con="inputfile"),那么这也会为下一个打印语句设置输出连接,如果您不调用,您将最终覆盖输入文件con=stdout() 在您的打印语句中。似乎 R 为任何下一个输入/输出语句保存了连接“con”的任何规范。