Как извлечь имя переменной в функции, которая вызывается из другой функции в R? - PullRequest
5 голосов
/ 22 февраля 2010

Мой вопрос: как извлечь имя переменной из функции, которая вызывается в другой функции в R?

Для иллюстрации приведу пример:

a <- function(variable) {

    print(deparse(substitute(variable)))

    internala(substitute(variable))

}

internala <- function(variableXX) {

    namex=deparse(substitute(variableXX))

    print(namex)
}

Вызов функции a дает следующий результат:

>a(whatever)

[1] "whatever"

[1] "substitute(variable)"

, что означает, что я могу извлечь имя переменной whatever из a, но не из internala.

Есть мысли по этому поводу?

Любая помощь будет оценена!

Maria

Ответы [ 3 ]

6 голосов
/ 22 февраля 2010

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

3 голосов
/ 22 февраля 2010

Вы можете изменить функцию a для замены аргумента функции internala и eval it:

a <- function(variable) {
    print(deparse(substitute(variable)))
    eval(substitute(internala(variable))) # this is only change
}

internala <- function(variableXX) {
    namex=deparse(substitute(variableXX))
    print(namex)
}

a(whatever)

Как сказал Хадли, лучше сразу передать имена. Я обычно делаю что-то подобное:

a <- function(variable, vname=deparse(substitute(variable))) {
    print(vname)
    internala(variable, vname)
}

internala <- function(variableXX, namex=deparse(substitute(variableXX))) {
    print(namex)
}

a(whatever)

Каждая функция может быть вызвана без передачи имени, но вы можете переопределить ее. Например:

a(whatever, "othername")
1 голос
/ 22 февраля 2010

Вот кое-что, что работает для меня. Однако я не уверен, что это оптимальное решение

a <- function(variable) {
print(deparse(substitute(variable)))
my_command <- paste('internala(',substitute(variable),')',sep = '')
eval(parse(text = my_command))
}

internala <- function(variableXX) {
namex=deparse(substitute(variableXX))
print(namex)
}
...