从功能内打印到R控制台

时间:2018-06-07 15:54:07

标签: r console cat error-checking

我想修改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()功能。有什么想法吗?

2 个答案:

答案 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”的任何规范。