Функция R со ссылкой на аргумент без его оценки

islands1<-islands #a named num (vector)

data.frame(island_col=names(islands1), number_col=islands1,row.names=NULL)

Это создает информационный кадр, состоящий из двух столбцов, первый содержит имена из названного вектора и называется "island_col", второй столбец содержит числа и называется "number_col". Здесь нет проблем.

Теперь предположим, что я пишу функцию, потому что у меня есть куча этих именованных векторов, которые я преобразую в кадры данных. Каждый вектор пронумерован, например, Islands1, Islands2 и т. Д.

dfunc<-function(x) data.frame(island_col=names(x), as.name(x)<-(x),row.names=NULL) Вот функция, которая использует data.frame для преобразования именованного вектора в фрейм данных

firstdf<-dfunc(islands) Я использую функцию на "Islands1" с именем вектора. Я хочу, чтобы числовой столбец был назван "Islands1", потому что это имя аргумента, но R не понимает этого и вместо этого пытается оценить сам аргумент. Я пробовал варианты с использованием функции paste0 и as.character, но не могу заставить его работать.

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

2 ответа

Решение

Я хочу, чтобы числовой столбец был назван "Islands1", потому что это имя аргумента...

использование deparse а также substitute следующее

islands1 <- c(a = 1, b = 2, c = 3)
islands2 <- c(d = 3, e = 2, g = 1)

func <- function(x){
  out <- data.frame(island_col = names(x), xSym = x)
  names(out)[2] <- deparse(substitute(x))
  out
}

func(islands1)
#R   island_col islands1
#R a          a        1
#R b          b        2
#R c          c        3
func(islands2)
#R   island_col islands2
#R d          d        3
#R e          e        2
#R g          g        1

Пытаться as.character(quote(islands1))

?quote: "quote просто возвращает свой аргумент. Аргумент не вычисляется и может быть любым выражением R".

Другие вопросы по тегам