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(")"
)
)
}
有什么建议吗?
扩展我的评论以消除任何混淆。
一个方法或建议是将字符串保存在一个变量中,最后输出即可。来自 value
的 cat(...)
的注释是 NULL(它不是 return 字符串)。这需要 2 个变量,我们称它们为 str
和 newstr
。我会让 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 检查 paste
的 collapse
参数(或者 paste0
)。我没有完整的概述,但如果字符串在其中一个函数调用中折叠,这似乎可以消除对 paste
的 2 - 3 次调用。
我编写了一个小函数,它通过遍历每个变量并在其周围粘贴各种标点符号来帮助重命名列,以便将文本发送到控制台。然后可以将其复制到我的脚本中并根据需要重命名变量。这是函数:
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(")"
)
)
}
有什么建议吗?
扩展我的评论以消除任何混淆。
一个方法或建议是将字符串保存在一个变量中,最后输出即可。来自 value
的 cat(...)
的注释是 NULL(它不是 return 字符串)。这需要 2 个变量,我们称它们为 str
和 newstr
。我会让 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 检查 paste
的 collapse
参数(或者 paste0
)。我没有完整的概述,但如果字符串在其中一个函数调用中折叠,这似乎可以消除对 paste
的 2 - 3 次调用。