R: создание именованного вектора из переменных - PullRequest
13 голосов
/ 18 февраля 2011

Внутри функции я определяю группу скалярных переменных, например:

a <- 10
b <- a*100
c <- a + b

В конце функции я хочу вернуть a,b,c в названном векторе ,с теми же именами, что и у переменных, с минимальным кодированием, т.е. я не не хочу делать:

c( a = a, b = b, c = c )

Существует ли языковая конструкция, которая делает это?Например, если я просто сделаю return(c(a,b,c)), он вернет неназванный вектор, а это не то, что я хочу.В настоящее время у меня есть хакерский способ сделать это:

> cbind(a,b,c)[1,]
   a    b    c 
  10 1000 1010 

Возможно, есть лучший, менее хакерский способ?

1 Ответ

13 голосов
/ 18 февраля 2011

Вот функция, которая сделает это за вас, которая также позволяет вам произвольно назвать некоторые значения. В этом нет ничего особенного, кроме уловки, чтобы получить неоцененное выражение и преобразовать его в один символьный вектор.

c2 <- function(...) {
  vals <- c(...)

  if (is.null(names(vals))) {
    missing_names <- rep(TRUE, length(vals))
  } else {
    missing_names <- names(vals) == ""
  }
  if (any(missing_names)) {
    names <- vapply(substitute(list(...))[-1], deparse, character(1))
    names(vals)[missing_names] <- names[missing_names]
  }

  vals
}

a <- 1
b <- 2
c <- 3

c2(a, b, d = c)
# a b d 
# 1 2 3 

Обратите внимание, что не гарантируется получение синтаксически допустимых имен. Если вы хотите, примените функцию make.names к вектору names.

c2(mean(a,b,c))
# mean(a, b, c) 
#            1 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...