Подтвердить что ты не робот

Преобразование строки в имя переменной

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

original_string <- "variable_name=variable_value"

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

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

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

variable_name <- parameter_value

Что это за функция? (?)?

4b9b3361

Ответ 2

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

 do.call("<-",list(parameter_name, parameter_value))

Ответ 4

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

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

Ответ 6

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()

Ответ 7

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.

Ответ 8

Я работал с этим несколько дней назад и заметил, что иногда вам нужно использовать функцию 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]))

Ответ 9

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

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

[1] "xxx"

Ответ 10

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

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

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 лет спустя ;-)