Перетворити рядок у ім'я змінної


100

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

original_string <- "variable_name=variable_value"

По-перше, я витягаю ім'я змінної та значення змінної з початкового рядка і конвертую це значення в числовий клас.

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

Потім я хотів би призначити значення змінній з тим самим іменем, що і рядок_імен параметра.

variable_name <- parameter_value

Що таке / які функції для цього?

Відповіді:


122

призначити - це те, що ви шукаєте.

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


"Остерігайтеся покупця" - це досить легкий спосіб сказати, що ви майже ніколи цього не повинні робити, оскільки це майже ніколи не є хорошим рішенням даної проблеми.
Конрад Рудольф

66

Ви можете використовувати do.call:

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

10
+1 для мислення. Люди (включаючи мене) зазвичай забувають, що <-це сама функція.
Роб


20

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

Я не знаю, якщо він відповідає на ваше запитання правильно


2
x=as.symbol("string")
Енріке Перес Ерреро

18

Ви шукаєте функцію get():

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

Підтвердження того, що адреса пам'яті однакова:

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

Довідка: R FAQ 7.21 Як я можу перетворити рядок у змінну?


1
Чудово! Це найкоротша відповідь, яку я знайшов. Чи є аналогічно стислий спосіб зробити зворотний? точно так самоx <- 42; deparse(substitute(x))
Miao Cai

10

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

5

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

Я працював над цим кілька днів тому, і помітив, що іноді вам потрібно буде використовувати 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]))


1

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

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

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 років по тому блукав тут;


0

Якщо ви хочете перетворити рядок у змінну всередині функції, але ви хочете мати змінну глобальну:

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

[1] "xxx"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.