我试图通过将其存储到文本变量中来获取多行代码的输出。为了生成输出,我将代码运行到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"
我不知道从哪里开始,任何建议都会受到赞赏。
答案 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]])