【发布时间】:2014-05-18 10:26:49
【问题描述】:
我试图通过将多行代码存储到文本变量中来获取输出。为了生成输出,我在 eval(parse()) 中运行代码。请注意,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
第一区: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);"))
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] " Min. 1st Qu. Median Mean 3rd Qu. Max. " [2]“0.006409 0.218700 0.445300 0.441700 0.635500 0.997800”
我不知道从哪里开始,任何建议都将不胜感激。
【问题讨论】: