Как в R получить имя объекта после его отправки в функцию?


136

Ищу обратное get().

Учитывая имя объекта, я хочу, чтобы символьная строка, представляющая этот объект, была извлечена непосредственно из объекта.

Тривиальный пример fooиспользования функции-заполнителя для функции, которую я ищу.

z <- data.frame(x=1:10, y=1:10)

test <- function(a){
  mean.x <- mean(a$x)
  print(foo(a))
  return(mean.x)}

test(z)

Напечатал бы:

  "z"

Моя работа, которую сложнее реализовать в моей текущей проблеме:

test <- function(a="z"){
  mean.x <- mean(get(a)$x)
  print(a)
  return(mean.x)}

test("z")

35
Я думаю, deparse(substitute(...))это то, что вам нужно
Чейз

2
Плохой пример, когда переменная называется «z», а параметр для тестирования также называется «z» ... Печать «z» на самом деле не говорит вам, правильно ли вы сделали это ;-)
Томми,

@Tommy, пытался улучшить его, но, пожалуйста, исправьте, если хотите.
Этьен Лоу-Декари,

Противоположность getR есть, assignно я не уверен, что это то, что вы действительно ищете ...
Том Келли

Ответы:


161

Старый трюк с заменой депарса:

a<-data.frame(x=1:10,y=1:10)
test<-function(z){
   mean.x<-mean(z$x)
   nm <-deparse(substitute(z))
   print(nm)
   return(mean.x)}

 test(a)
#[1] "a"   ... this is the side-effect of the print() call
#          ... you could have done something useful with that character value
#[1] 5.5   ... this is the result of the function call

Изменить: запустить его с новым тестовым объектом

Примечание: это не удастся внутри локальной функции, когда набор элементов списка передается из первого аргумента в lapply(и это также не удается, когда объект передается из списка, заданного в for-loop.) Вы можете извлечь Атрибут ".Names" и порядок обработки из результата структуры, если это был именованный вектор, который обрабатывался.

> lapply( list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]
[1] "X"    ""     "1L]]"


$b
$b[[1]]
[1] "X"    ""     "2L]]"

> lapply( c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')} )
$a
$a[[1]]
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""                                            
[3] "1L]]"                                        


$b
$b[[1]]
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""                                            
[3] "2L]]"  

11
deparse(quote(var))

Мое интуитивное понимание, в котором цитата замораживает переменную или выражение из оценки, а функция deparse, которая является инверсией функции синтаксического анализа, возвращает этот замороженный символ обратно в строку


6

Обратите внимание, что для методов печати поведение может быть другим.

print.foo=function(x){ print(deparse(substitute(x))) }
test = list(a=1, b=2)
class(test)="foo"
#this shows "test" as expected
print(test)

#this shows 
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")"
test

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


Возможно, так и должно быть: print.foo=function(x){ cat(deparse(substitute(x))) }илиprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Илиprint.foo=function(x){ print.default(as.list(x)) }
IRTFM
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.