【问题标题】:Is it possible to write stdout using write_csv() from readr?是否可以使用 readr 的 write_csv() 写入标准输出?
【发布时间】:2016-06-13 20:41:49
【问题描述】:

我正在使用bash 通过Rscript 传递数据,如下所示: cat random.csv | Rscript test.R arg >| delete.csv

我的目标是使用Rreadr 来读取标准输入和写入标准输出。我找到了answer to stdin here

test.R

#!/usr/bin/Rscript
suppressMessages(library(readr))

args  <- commandArgs(trailingOnly = TRUE)

df.in <- read_csv(file("stdin"))

write_csv(df.in, path = stdout())

以上代码在命令行产生以下错误信息:

错误信息

Error in path.expand(path) : invalid 'path' argument
Calls: write_csv -> write_delim -> normalizePath -> path.expand
Execution halted

我也试过write_csv(df.in, file("stdout"))write_csv(df.in, stdout()) 产生同样的错误信息。

为了重现性,这里是random.csv的链接

Definition of variables, by WHO for the Global Tuberculosis Report [43kb]

【问题讨论】:

标签: r bash readr


【解决方案1】:

使用来自基本 R 的 write.tablewrite.csv,您可以将文件名指定为 "" 以打印到 STDOUT:

file: either a character string naming a file or a connection open
      for writing.  ‘""’ indicates output to the console.

例子:

$ Rscript -e 'write.csv(head(mtcars),"",quote=F)'
,mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
Mazda RX4,21,6,160,110,3.9,2.62,16.46,0,1,4,4
Mazda RX4 Wag,21,6,160,110,3.9,2.875,17.02,0,1,4,4
Datsun 710,22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
Hornet 4 Drive,21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
Hornet Sportabout,18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
Valiant,18.1,6,225,105,2.76,3.46,20.22,1,0,3,1

【讨论】:

    【解决方案2】:

    你可以使用write.table:

    write.table(x, file = "foo.csv", sep = ",", col.names = NA,
            qmethod = "double")
    

    查看帮助页面:https://stat.ethz.ch/R-manual/R-devel/library/utils/html/write.table.html

    【讨论】:

    • 这回答了错误的问题 - OP 知道如何格式化为 CSV,但不知道如何写入 stdout
    【解决方案3】:

    用于从标准输入读取:

    df.in <- read_csv(paste(collapse = "\n", readLines(file("stdin"))))
    

    用于写入标准输出:

    writeLines(format_csv(tibble(a=c(1,2))), stdout())
    
    #or
    writeLines(format_csv(df.in), stdout())
    

    感谢:jimhester

    【讨论】:

      【解决方案4】:

      readr 中有一个 format_csv 函数。用这个代替write_csv

      cat(format_csv(df.in))
      

      【讨论】:

      • 谢谢@m0nhawk - 这非常接近。错误消息不再出现。但是,delete.csv 在应该有多行时将所有数据打印在单行上。如果你用cat() 包装你的答案,结果是正确的。例如cat(format_csv(df.in))。更新,我会接受你的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多