【问题标题】:R copy text from function output with for loop to clipboardR使用for循环将文本从函数输出复制到剪贴板
【发布时间】:2019-10-21 21:16:46
【问题描述】:

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

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(")"
  )
  )
}

有什么建议吗?

【问题讨论】:

  • 建议:在loop调用writeClipboard(str)之后,创建一个变量并连接结果str &lt;- paste(str, newstr, sep = "\n")
  • 谢谢,你的意思是str &lt;- (cat(paste(df_name......writeLines(")" )?我似乎无法解决

标签: r function for-loop clipboard


【解决方案1】:

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

一种方法或建议是将字符串存储在一个变量中,然后可以在最后输出。请注意,cat(...)value 为 NULL(它不返回字符串)。这需要 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 次调用。

【讨论】:

  • 没问题。请注意,我指的是pastepaste0 中的collapse 参数。例如,它可以用于连接向量paste0(c("I", "am", "a", "cat"), collapse = " ")。为简单起见,paste0(...) 等效(但每个都比paste(..., sep = "") 稍快)。 :-)
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多