在R中捕获多行终端输出

在R中捕获多行终端输出,r,parsing,eval,R,Parsing,Eval,我试图通过将多行代码的输出存储到文本变量中来获得它。为了生成输出,我将代码运行到eval(parse())中。请注意,parse()已通过黑名单清除了“坏”命令,并且发送代码的用户是可信的 下面的功能非常适合捕获向控制台发送文本的一个函数的输出: eval(parse(text= "x=runif(50,0,1); y=rnorm(50,0,1); df = data.frame(x=x,y=y); summary(df);")) 最小值:0.03062最小值:-1.86479 第一区:0.2

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

下面的功能非常适合捕获向控制台发送文本的一个函数的输出:

eval(parse(text=
"x=runif(50,0,1);
y=rnorm(50,0,1);
df = data.frame(x=x,y=y);
summary(df);"))
最小值:0.03062最小值:-1.86479
第一区:0.27582第一区:-0.45773
中位数:0.52880中位数:0.03051
平均值:0.50302平均值:0.01219
第三区:0.68359第三区: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);"))
0.03062 0.27580 0.52880 0.50300 0.68360 0.97230

我实现黑名单的一种方法是循环parse()的输出:

表达式(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] “最小一次弯曲平均三次弯曲最大值” [2] “0.006409 0.218700 0.445300 0.441700 0.635500.997800”


我不知道从这里该怎么办,任何建议都将不胜感激。

利用
评估
软件包

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]])

是否有任何方法阻止终端线发送到输出?我主要对最终结果感兴趣。我建议您仔细查看
评估
。它基本上可以做你想做的所有事情。
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)
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]])