Преобразовать строку в имя переменной - PullRequest
84 голосов
/ 17 мая 2011

Я использую R для анализа списка строк в форме:

original_string <- "variable_name=variable_value"

Сначала я извлекаю имя и значение переменной из исходной строки и преобразую значение в числовой класс.

parameter_value <- as.numeric("variable_value")
parameter_name <- "variable_name"

Затем я хотел бы присвоить значение переменной с тем же именем, что и строка имя_параметра.

variable_name <- parameter_value

Что такое функции для выполненияэто?

Ответы [ 9 ]

108 голосов
/ 17 мая 2011

назначить это то, что вы ищете.

assign("x", 5)

x
[1] 5

но покупатель остерегается.

См. R FAQ 7.21 http://cran.r -project.org / DOC / FAQ / R-faq.html # Как-кан-I-поворот-а-строка-в-а-variable_003f

58 голосов
/ 18 мая 2011

Вы можете использовать do.call:

 do.call("<-",list(parameter_name, parameter_value))
42 голосов
/ 21 января 2016

Существует еще одно простое решение: http://www.r -bloggers.com / превращающая струна к-а-переменного имя-на-лета-и-наоборот-в-г /

Чтобы преобразовать строку в переменную:

x <- 42
eval(parse(text = "x"))
[1] 42

И наоборот:

x <- 42
deparse(substitute(x))
[1] "x"
15 голосов
/ 23 мая 2013

использовать x = as.name ("строка") Вы можете использовать затем использовать x для ссылки на переменную с именем строки.

Не знаю, правильно ли он отвечает на ваш вопрос

10 голосов
/ 17 мая 2011

strsplit для анализа вашего ввода и, как упомянул Грег, assign для назначения переменных.

original_string <- c("x=123", "y=456")
pairs <- strsplit(original_string, "=")
lapply(pairs, function(x) assign(x[1], as.numeric(x[2]), envir = globalenv()))
ls()
9 голосов
/ 07 мая 2018

Функция, которую вы ищете: get():

assign ("abc",5)
get("abc")

Подтверждение того, что адрес памяти идентичен:

getabc <- get("abc")
pryr::address(abc) == pryr::address(getabc)
# [1] TRUE

Ссылка: R FAQ 7.21 Как можноПревратить строку в переменную?

5 голосов
/ 14 июля 2015

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

Скажем, я только что присвоил значение 5 x (var.name <- "x"; assign(var.name, 5)) и хочу изменить его на 6. Если я пишу скрипт и заранее не знаю, как называется переменная (var.name) ) будет (что, кажется, является точкой функции assign), я не могу просто поставить x <- 6, потому что var.name мог бы быть "y". Итак, я делаю:

var.name <- "x"
#some other code...
assign(var.name, 5)
#some more code...

#write a script file (1 line in this case) that works with whatever variable name
write(paste0(var.name, " <- 6"), "tmp.R")
#source that script file
source("tmp.R")
#remove the script file for tidiness
file.remove("tmp.R")

x будет изменено на 6, и если имя переменной отличалось от "x", эта переменная также будет изменена на 6.

2 голосов
/ 12 июля 2018

Я работал с этим несколько дней назад и заметил, что иногда вам нужно использовать функцию get() для вывода результатов вашей переменной. то есть:

varnames = c('jan', 'feb', 'march')
file_names = list_files('path to multiple csv files saved on drive')
assign(varnames[1], read.csv(file_names[1]) # This will assign the variable

Оттуда, если вы попытаетесь напечатать переменную varnames[1], она вернет 'jan'. Чтобы обойти это, вам нужно сделать print(get(varnames[1]))

0 голосов
/ 08 июля 2019

Если вы хотите преобразовать строку в переменную внутри тела функции, но хотите иметь глобальную переменную:

test <- function() {
do.call("<<-",list("vartest","xxx"))
}
test()
vartest

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