R使用for循环将函数输出中的文本复制到剪贴板

R copy text from function output with for loop to clipboard

我编写了一个小函数,它通过遍历每个变量并在其周围粘贴各种标点符号来帮助重命名列,以便将文本发送到控制台。然后可以将其复制到我的脚本中并根据需要重命名变量。这是函数:

library(tidyverse)
tidy_rename <- function (df) {
  df_name <- deparse(substitute(df))
  names(df) <- tolower(names(df))
  cat(paste(df_name, " <- ", paste(df_name, "%>%\n\t rename(")))
  for (i in names(df)) {
    cat(paste("\t\t", paste(paste("=", paste(paste('"', i), '"'))), ","), sep="\n")
  }
  writeLines(")"
  )
}

如果我在数据集上使用它:

test_df <- data.frame("VarIable 1" = c(1), "sizrd" = c(1), "dat 1" = c(1), 
                      "x-cord" = c(1), "y-crf" = c(1), "aGe" = c(1), check.names=F)
tidy_rename(test_df)

其中提供了以下内容,可以将其复制并粘贴到脚本中:

test_df  <-  test_df %>%
     rename(         = " variable 1 " ,
         = " sizrd " ,
         = " dat 1 " ,
         = " x-cord " ,
         = " y-crf " ,
         = " age " ,
)

我想要的是在函数内自动将此输出复制到剪贴板。我不确定如何在 forloop 周围使用 writeClipboard。这不起作用:

tidy_rename <- function (df) {
  df_name <- deparse(substitute(df))
  names(df) <- tolower(names(df))
  writeClipboard(
  cat(paste(df_name, " <- ", paste(df_name, "%>%\n\t rename(")))
  for (i in names(df)) {
    cat(paste("\t\t", paste(paste("=", paste(paste('"', i), '"'))), ","), sep="\n")
  }
  writeLines(")"
  )
  )
}

有什么建议吗?

扩展我的评论以消除任何混淆。

一个方法或建议是将字符串保存在一个变量中,最后输出即可。来自 valuecat(...) 的注释是 NULL(它不是 return 字符串)。这需要 2 个变量,我们称它们为 strnewstr。我会让 str 存储要复制的整个字符串,newstr 存储 cat(...).

输出的当前字符串
tidy_rename <- function (df) {
    df_name <- deparse(substitute(df))
    names(df) <- tolower(names(df))

    str <- paste(df_name, " <- ", paste(df_name, "%>%\n\t rename(")) 
    cat(str)
    for (i in names(df)) {
        #Store variable at each iteration and expand str. Output newstr.
        newstr <- paste("\t\t", paste(paste("=", paste(paste('"', i), '"'))), ",")
        str <- paste(str, newstr, sep = "\n")
        cat(newstr, sep="\n")
    }
    newstr <- ")"
    str <- paste0(str, newstr)
    cat(newstr)
    writeClipboard(str)
}

请注意每次迭代时输出如何存储在 str 中,但输出 newstr

作为旁注,我建议 OP 检查 pastecollapse 参数(或者 paste0)。我没有完整的概述,但如果字符串在其中一个函数调用中折叠,这似乎可以消除对 paste 的 2 - 3 次调用。