R копировать текст из функции вывода с помощью цикла for в буфер обмена - PullRequest
0 голосов
/ 22 октября 2019

Я написал небольшую функцию, которая помогает переименовывать столбцы, просматривая каждую переменную и вставляя вокруг нее различные знаки препинания, чтобы текст отправлялся на консоль. Затем его можно скопировать в мой скрипт и переименовать переменные по мере необходимости. Это функция:

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 " ,
)

Я хотел бы автоматически скопировать этот вывод в буфер обмена внутри функции. Я не уверен, как использовать writeClipboard вокруг forloop. Это не работает:

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

Есть предложения, пожалуйста?

1 Ответ

1 голос
/ 22 октября 2019

Расширение моего комментария, чтобы устранить любую путаницу.

Метод или предложение - сохранить строку в переменной, которая затем может быть выведена в конце. Примечание от value из cat(...) равно NULL (строка не возвращается). Для этого нужны 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 проверил аргумент collapse paste (или paste0). У меня нет полного обзора, но кажется, что это может исключить 2-3 вызова paste, если строки были свернуты в рамках одного из вызовов функции.

...