Поиск имени объекта, к которому возвращается функция - PullRequest
4 голосов
/ 15 декабря 2011

Мой вопрос следующий. Учитывая следующую функцию:

spam <- function() {
  cat("eggs\n")
}

bla <- spam()

Я хочу найти имя объекта, которому функция возвращает свое содержимое. В примере bla <- spam() это будет bla. Используя match.call, я могу найти выполненный звонок:

match.call()
function() {
      cat("eggs\n")
    }   

это, однако, не включает в себя имя объекта, к которому возвращается функция. Я просмотрел список R-help, Google и SO, но не смог найти ничего полезного. Любые предложения, как поступить?

Фон Из ответов я понимаю, что то, что я хочу, немного на эзотерической стороне. Я бы объяснил, откуда я, это может пролить свет на мои мотивы. Контекст, в котором я работаю, связан с тестированием и, в частности, с тестированием, изменяется ли определенный объект во времени (например, вывод модели).

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

spam <- testReferenceChange(expression)

Обычно эта функция считывает ссылку и генерирует новый объект, который пользователь может сравнивать друг с другом. Для восстановления ссылочного файла я хотел использовать точно такой же код. Я делаю это, изменяя глобальные параметры (см. options и getOption), recalculate. Мы запускаем эту функцию в режиме пересчета, новые ссылки сохраняются. А теперь по причине моего вопроса. При сохранении ссылки на файл (используя save()) я хотел использовать имя объекта, к которому возвращается пользователь, в сочетании с датой, чтобы создать уникальное имя.

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

... Мне трудно представить, почему ты этого хочешь. Кроме того, ваша spam функция возвращает NULL, поэтому она кажется еще более бессмысленной ...

Тем не менее, самый простой / чистый способ сделать это - передать имя функции spam!

spam <- function(name) {
   cat(name, "<- eggs\n")
   42 # return a value
}


bla <- spam("bla")

Переходя на следующий уровень, вы могли бы spam выполнить задание. Вы также можете поиграть с substitute, чтобы указать имя без кавычек:

spam <- function(name) {
   name <- as.character(substitute(name))
   cat(name, "<- eggs\n")
   value <- 42
   assign(name, value, parent.frame())
}

spam(bla)
bla # 42
0 голосов
/ 27 декабря 2018

У меня была похожая потребность и я думал об этом решении ... Возможно, оно не идеально, но пока у меня были хорошие результаты с ним.

getLastCreatedObj <- function() {
  tmpfile <- tempfile("hist", fileext = ".txt")
  savehistory(file = tmpfile)
  last_command <- tail(readLines(tmpfile), 2)[1]
  unlink(tmpfile)
  if (grepl("^[a-zA-Z_.0-9]+\\s*(<-|=)", last_command)) {
    all_names <- all.names(as.expression(parse(text = s)))
    varname <- all_names[grep("(<-|=)", all_names) + 1]
    return(varname)
  }
  return(NULL)
}

Обратите внимание, что вы не можете использовать его в пакете; не проходит проверку с сообщением 'savehistory' can only be used in Rgui and Rterm.

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