【问题标题】:Write lines of text to a file in R将文本行写入R中的文件
【发布时间】:2021-04-28 15:25:37
【问题描述】:

在R脚本语言中,如何写一行文字,例如以下两行

Hello
World

到一个名为“output.txt”的文件?

【问题讨论】:

    标签: file-io r


    【解决方案1】:
    fileConn<-file("output.txt")
    writeLines(c("Hello","World"), fileConn)
    close(fileConn)
    

    【讨论】:

    • Mark - 如果我有多个线程,我想在同一个文件中添加行? (问题是您不能与文件建立多个连接,如果我没记错的话)谢谢。
    • @Tal,这是一个很好的问题,你应该把它作为一个新的、单独的问题发布,这样它会得到一些关注。这里有比我更多知识渊博的 R 程序员!
    • 请注意,这需要文件“output.txt”已经存在。如果没有,则必须先创建它,例如使用'file.create("output.txt")'。
    • @jhin 我不确定这是否属实。使用 RStudio 0.98 和 R 版本 3.1.0,如果文件不存在,则会自动创建文件
    • writeLines() 的选项比sink()cat() 的组合快大约十倍
    【解决方案2】:

    其实你可以sink()做到这一点:

    sink("outfile.txt")
    cat("hello")
    cat("\n")
    cat("world")
    sink()
    

    因此:

    file.show("outfile.txt")
    # hello
    # world
    

    【讨论】:

    • sink() 在 Databricks 上不起作用小心。您可以使用将所有这些放在一个函数中并调用此函数,如 capture.output(funciton call, filename)
    • 感谢@aL3xa。但请记住,此代码有效地从控制台写入所有内容,包括执行的代码。
    【解决方案3】:

    我将使用cat() 命令,如本例所示:

    > cat("Hello",file="outfile.txt",sep="\n")
    > cat("World",file="outfile.txt",append=TRUE)
    

    然后您可以使用 R 查看结果

    > file.show("outfile.txt")
    hello
    world
    

    【讨论】:

    • 它不断地打开和关闭一个文件。这种方法可能效率低下。
    【解决方案4】:

    简单的writeLines() 是什么意思?

    txt <- "Hallo\nWorld"
    writeLines(txt, "outfile.txt")
    

    txt <- c("Hallo", "World")
    writeLines(txt, "outfile.txt")
    

    【讨论】:

    • 很高兴表明输入不必是线向量
    • @tim 实际上"Hallo\nWorld" 是字符类型的长度为一的向量。试试txt &lt;- "Hallo\nWorld"; is.character(txt) &amp;&amp; length(txt) == 1 &amp;&amp; is.vector(txt)
    • 这对我只适用于writeLines(txt, con="outfile.txt")
    • 不,只要您提供一个有效的文件名作为第二个参数,就应该在没有命名参数的情况下工作。
    • @petermeissner &gt; coefficients&lt;-summary(model) &gt; writeLines(coefficients, "coefficients") Error in writeLines(coefficients, "coefficients") : invalid 'text' argument
    【解决方案5】:

    你可以在一个语句中做到这一点

    cat("hello","world",file="output.txt",sep="\n",append=TRUE)
    

    【讨论】:

      【解决方案6】:

      我建议:

      writeLines(c("Hello","World"), "output.txt")
      

      它比当前接受的答案更短更直接。 没有必要这样做:

      fileConn<-file("output.txt")
      # writeLines command using fileConn connection
      close(fileConn)
      

      因为writeLines() 的文档说:

      如果con是字符串,函数调用file获取 在函数执行期间打开的文件连接 打电话。

      # default settings for writeLines(): sep = "\n", useBytes = FALSE
      # so: sep = "" would join all together e.g.
      

      【讨论】:

      • 补充一下,writeLines 只能打印字符向量。
      【解决方案7】:

      将文本行写入 R 中的文件的短方法可以使用 catwriteLines 来实现,如许多答案中所示。一些最短的可能性可能是:

      cat("Hello\nWorld", file="output.txt")
      writeLines("Hello\nWorld", "output.txt")
      

      如果您不喜欢“\n”,也可以使用以下样式:

      cat("Hello
      World", file="output.txt")
      
      writeLines("Hello
      World", "output.txt")
      

      虽然writeLines 在文件末尾添加了一个换行符,但cat 却不是这样。 可以通过以下方式调整此行为:

      writeLines("Hello\nWorld", "output.txt", sep="") #No newline at end of file
      cat("Hello\nWorld\n", file="output.txt") #Newline at end of file
      cat("Hello\nWorld", file="output.txt", sep="\n") #Newline at end of file
      

      但主要区别在于 cat 使用 R 对象writeLines 一个 字符向量 作为参数。所以写出来例如1:10 需要为 writeLines 转换数字,而它可以像在 cat 中一样使用:

      cat(1:10)
      writeLines(as.character(1:10))
      

      cat 可以接受许多 个对象,但writeLines 只能接受一个 向量:

      cat("Hello", "World", sep="\n")
      writeLines(c("Hello", "World"))
      

      【讨论】:

        【解决方案8】:

        tidyverse 版本,带有管道和来自阅读器的write_lines()

        library(tidyverse)
        c('Hello', 'World') %>% write_lines( "output.txt")
        

        【讨论】:

          【解决方案9】:

          简单的write.table()怎么样?

          text = c("Hello", "World")
          write.table(text, file = "output.txt", col.names = F, row.names = F, quote = F)
          

          参数col.names = FALSErow.names = FALSE确保排除txt中的行名和列名,参数quote = FALSE排除txt中每行开头和结尾的引号。 要重新读入数据,您可以使用text = readLines("output.txt")

          【讨论】:

            【解决方案10】:

            如果需要,您可以将writeLines()sink() 结合使用:

            > sink("tempsink", type="output")
            > writeLines("Hello\nWorld")
            > sink()
            > file.show("tempsink", delete.file=TRUE)
            Hello
            World
            

            对我来说,使用print() 似乎总是最直观的,但如果你这样做,输出将不是你想要的:

            ...
            > print("Hello\nWorld")
            ...
            [1] "Hello\nWorld"
            

            【讨论】:

              【解决方案11】:

              基于the best answer:

              file <- file("test.txt")
              writeLines(yourObject, file)
              close(file)
              

              注意yourObject需要是字符串格式;如果需要,请使用as.character() 进行转换。

              但是对于每一次保存尝试来说,输入太多了。让我们在 RStudio 中创建一个 sn-p。

              在全局选项>>代码>>片段中,输入:

              snippet wfile
                  file <- file(${1:filename})
                  writeLines(${2:yourObject}, file)
                  close(file)
              

              然后,在编码过程中,输入wfile 并按Tab

              【讨论】:

              • file &lt;- file(...) 行在我看来很可疑。是不是既调用file 作为函数又赋予file 一个新的含义?即使在这段代码运行之后,file() 是否仍然有效?目前无权访问 R 安装来测试自己...
              • 它适用于我的设置@Palec 如果您对保留字有疑问,可以将文件更改为 youFile
              【解决方案12】:

              丑陋的系统选项

              ptf <- function (txtToPrint,outFile){system(paste(paste(paste("echo '",cat(txtToPrint),sep = "",collapse = NULL),"'>",sep = "",collapse = NULL),outFile))}
              #Prints txtToPrint to outFile in cwd. #!/bin/bash echo txtToPrint > outFile
              

              【讨论】:

                【解决方案13】:

                在较新版本的 R 中,writeLines 将保留文本中的回车符和空格,因此您无需在行尾包含 \n,您可以将一大块文本写入文件。这将适用于示例,

                txt <- "Hello
                World"
                fileConn<-file("output.txt")
                writeLines(txt, fileConn)
                close(fileConn)
                

                但您也可以使用此设置来简单地包含具有结构的文本(换行符或缩进)

                txt <- "Hello
                   world
                 I can 
                   indent text!"
                fileConn<-file("output.txt")
                writeLines(txt, fileConn)
                close(fileConn)
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-06-30
                  • 2012-06-04
                  • 2014-02-02
                  相关资源
                  最近更新 更多