在R中捕获多行终端输出

时间:2014-04-06 07:14:25

标签: r parsing eval

我试图通过将其存储到文本变量中来获取多行代码的输出。为了生成输出,我将代码运行到eval(parse())。请注意,解析()已被清理为“坏”'通过黑名单命令,发送代码的用户是可信的。

下面非常适合捕获将文本发送到控制台的ONE函数的输出:

eval(parse(text=
"x=runif(50,0,1);
y=rnorm(50,0,1);
df = data.frame(x=x,y=y);
summary(df);"))
  x                 y           
     

最小。 :0.03062分钟:-1.86479
  1 Qu.:0.27582 1st Qu.:-0.45773
  中位数:0.52880中位数:0.03051
  平均值:0.50302平均值:0.01219
  3 Qu.:0.68359 3rd Qu。:0.36462
  最大。 :最大值0.97232 :3.08798

上述格式非常适合显示,因为它没有任何引号和终端线标记(即[1]" ...")

但是,如果我通过包含输出文本的第二个命令稍微修改捕获,我将只接收生成文本的最后一个命令的输出:

eval(parse(text="set.seed(200);x=runif(50,0,1);y=rnorm(50,0,1);df = data.frame(x=x,y=y);summary(df);
summary(x);"))
  Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     

0.03062 0.27580 0.52880 0.50300 0.68360 0.97230

我实施黑名单的方法之一是循环使用parse()输出:

mm=parse(text="set.seed(200);x=runif(50,0,1);y=rnorm(50,0,1);df = data.frame(x=x,y=y);summary(df);
summary(x);")
  

表达式(set.seed(200),x = runif(50,0,1),y = rnorm(50,0,1),df = data.frame(x = x,y = y),      摘要(df),摘要(x))

因此,我捕获多个命令的第一直觉是使用capture.output()。但是,因为parse()提供了一个表达式()的数组,所以capture.output()只产生最后一个eval(),除了输出受到其他字符的诽谤:

capture.output(eval(parse(text="x=runif(50,0,1);
y=rnorm(50,0,1);
plot(x,y);
summary(df);summary(x)")))
  

[1]"闵。第一曲。中位数第3曲。最大。 "   [2]" 0.006409 0.218700 0.445300 0.441700 0.635500 0.997800"

我不知道从哪里开始,任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

使用evaluate包。

code = "x=runif(50,0,1);
y=rnorm(50,0,1);
df = data.frame(x=x,y=y);
summary(df);"

replay(evaluate(code))

如果要将结果保存为字符串,

s = paste(capture.output(replay(evaluate(code))), collapse="\n")
cat(s)

您可以将evaluate返回的结果保存在列表中。

code = "x=runif(50,0,1);
y=rnorm(50,0,1);
df = data.frame(x=x,y=y);
summary(df);
summary(x);
"

dont_print_source = function(x){
    if (class(x)!="source"){
        cat(x)
    }
}
L = evaluate(code)
for(i in 1:length(L)) dont_print_source(L[[i]])