Выведите вектор в R в том же формате, который используется для ввода его в R

Возможно, я представляю это, но я думаю, что есть встроенная функция R, которая позволяет печатать вектор R (и, возможно, другие объекты, такие как матрицы и кадры данных) в том формате, который вы использовали бы для ввода этого объекта (возвращаемого как строка). Например,

> x <- c(1,2,3)
> x
[1] 1 2 3
> magical.function(x)
"c(1,2,3)" 

Существует ли эта функция?

Ответ 1

dput может быть?

> test <- c(1,2,3)
> dput(test)
c(1, 2, 3)

Вы также можете dump несколько объектов за один проход в файл, который написан в вашем рабочем каталоге:

> test2 <- matrix(1:10,nrow=2)
> test2
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> dump(c("test","test2"))

dumpdata.r затем будет содержать:

test <-
c(1, 2, 3)
test2 <-
structure(1:10, .Dim = c(2L, 5L))

Ответ 2

Я решил добавить это решение слишком, потому что обнаружил, что dput() не работает для того, что я пытался сделать. У меня есть shiny приложение, которое использует knitr для создания отчетов на основе пользовательского сеанса, и я использую knit_expand() прежде чем передавать свой.Rmd для вывода параметров пользователя из блестящей сессии в.Rmd.

Не вдаваясь в подробности, мне нужно переносить векторы "как есть", потому что они будут записаны в строки кода в.Rmd, которые кто-то будет запускать. В этом случае dput() не работала, потому что вывод был только плюем на консоль, а метод dump() работает, но я не хотел писать новые файлы каждый раз и удалять их.

Может быть, лучший способ, но я написал функцию, которая возвращает объект символа вектора "как есть". Он обрабатывает как числовые, так и символьные векторы (он выдает кавычки вокруг каждого члена символьного вектора). Он также обрабатывает отдельные входы и просто возвращает их, как они есть. Это не очень, и я уверен, что есть более эффективные способы написать его, но он отлично работает для моих нужд. Думал, я бы добавил это решение в драку.

printVecAsis <- function(x) {
  ifelse(length(x) == 1, x, 
       ifelse(is.character(x), paste0("c(", paste(sapply(x, function(a) paste0("\'",a,"\'")), collapse=", "), ")"),
              paste0("c(", paste(x, collapse=", "), ")")))}