Персонаж без кавычек - PullRequest
1 голос
/ 26 мая 2019

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

#make a new iris with a bad name
badnameiris = iris
#save it to a file
save(badnameiris, file = "iris.rdata")
#rename badname version from global envir
rm(badnameiris)
#read iris from file
irisname = load("iris.rdata")
#this variable is not iris, but the name of the variable it was assigned to
irisname
[1] "badnameiris"
#it's to use the right name with get()
goodnameiris = get(irisname)
#but harder to get rid of the wrong one with rm()
rm(irisname)

Последняя строка не работает должным образом, потому что требует ввода пустого имени и получает символьный вектор. Я понимаю, что на самом деле можно использовать аргумент list в rm(), но предположим, что нельзя.

Как вообще можно преобразовать персонажа в не цитируемого для этих целей?

Я попробовал функции rlang , но они предназначены для нестандартной оценки, используемой в контексте tidyverse . Я попытался as.name(), , как предложено здесь . Тоже не работает. Большинство вопросов, которые я мог найти, задавая этот вопрос, относятся к tidyverse , но я пытаюсь сделать контекст Base R.

(альтернативное решение выше - создать функцию, которая использует уничтожение локальной среды для удаления нежелательной копии объекта.)

1 Ответ

4 голосов
/ 26 мая 2019

Просто используйте do.call:

x <- 1
s <- "x"
do.call(rm, list(s))
ls()
#[1] "s"

Или рассчитать на языке:

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