【问题标题】:Capturing multiple lines of terminal output in R在R中捕获多行终端输出
【发布时间】: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”

我不知道从哪里开始,任何建议都将不胜感激。

【问题讨论】:

    标签: r parsing eval


    【解决方案1】:

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

    【讨论】:

    • 是否有抑制终端线被发送到输出的方法?我主要对出现的最终结果感兴趣。
    • 我建议你仔细看看evaluate。它基本上可以做你想做的所有事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多