Ответ 1
Назначение - это то, что вы ищете.
assign("x", 5)
x
[1] 5
но покупатель остерегается.
См. R FAQ 7.21 http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f
Я использую R для разбора списка строк в форме:
original_string <- "variable_name=variable_value"
Сначала я извлекаю имя переменной и значение из исходной строки и преобразую значение в числовой класс.
parameter_value <- as.numeric("variable_value")
parameter_name <- "variable_name"
Затем я хотел бы присвоить значение переменной с тем же именем, что и строка параметра_name.
variable_name <- parameter_value
Что это за функция? (?)?
Назначение - это то, что вы ищете.
assign("x", 5)
x
[1] 5
но покупатель остерегается.
См. R FAQ 7.21 http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f
Вы можете использовать do.call:
do.call("<-",list(parameter_name, parameter_value))
Существует еще одно простое решение: http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/
Чтобы преобразовать строку в переменную:
x <- 42
eval(parse(text = "x"))
[1] 42
И наоборот:
x <- 42
deparse(substitute(x))
[1] "x"
использовать x = as.name( "string" ) вы можете использовать, затем использовать x для ссылки на переменную с строкой имени.
Я не знаю, правильно ли он ответил на ваш вопрос.
Функция, которую вы ищете, это get()
:
assign ("abc",5)
get("abc")
Подтверждая, что адрес памяти идентичен:
getabc <- get("abc")
pryr::address(abc) == pryr::address(getabc)
# [1] TRUE
Ссылка: R FAQ 7.21 Как я могу превратить строку в переменную?
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()
assign
хорош, но я не нашел функцию для возврата назад к переменной, которую вы создали в автоматическом script. (as.name
, похоже, работает наоборот). У более опытных кодеров, несомненно, будет лучшее решение, но это решение работает и, по-видимому, немного юмористично, поскольку оно позволяет R писать код для себя.
Скажем, я только что назначил значение 5 на x
(var.name <- "x"; assign(var.name, 5)
), и я хочу изменить значение на 6. Если я пишу script и не знаю заранее, какое имя переменной (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.
Я работал с этим несколько дней назад и заметил, что иногда вам нужно использовать функцию 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]))
Если вы хотите преобразовать строку в переменную внутри тела функции, но хотите иметь переменную global:
test <- function() {
do.call("<<-",list("vartest","xxx"))
}
test()
vartest
[1] "xxx"
Может быть, я не правильно понял вашу проблему из-за простоты вашего примера. Насколько я понимаю, у вас есть ряд инструкций, хранящихся в символьных векторах, и эти инструкции очень близки к правильному форматированию, за исключением того, что вы хотите привести правильный элемент к числовому.
Если мое понимание верно, я хотел бы предложить немного другой подход, который не основан на разбиении вашей исходной строки, но непосредственно оценивает вашу инструкцию (с небольшим улучшением).
original_string <- "variable_name=\"10\"" # Your original instruction, but with an actual numeric on the right, stored as character.
library(magrittr) # Or library(tidyverse), but it seems a bit overkilled if the point is just to import pipe-stream operator
eval(parse(text=paste(eval(original_string), "%>% as.numeric")))
print(variable_name)
#[1] 10
По сути, мы "улучшаем" вашу инструкцию variable_name="10"
, чтобы она превратилась в variable_name="10" %>% as.numeric
, что эквивалентно variable_name=as.numeric("10")
с синтаксисом конвейерного потока magrittr
. Затем мы оцениваем это выражение в текущей среде.
Надеюсь, это поможет кому-то, кто бродит здесь 8 лет спустя ;-)