Ubah string menjadi nama variabel

100

Saya menggunakan R untuk mengurai daftar string dalam bentuk:

original_string <- "variable_name=variable_value"

Pertama, saya mengekstrak nama variabel dan nilai dari string asli dan mengonversi nilainya ke kelas numerik.

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

Kemudian, saya ingin menetapkan nilai ke variabel dengan nama yang sama dengan string parameter_name.

variable_name <- parameter_value

Apa fungsi untuk melakukan ini?

KnowledgeBone
sumber

Jawaban:

66

Anda dapat menggunakan do.call:

 do.call("<-",list(parameter_name, parameter_value))
Wojciech Sobala
sumber
10
1 untuk berpikir. Orang (termasuk saya) biasanya lupa bahwa itu <-adalah fungsi itu sendiri.
Rob
20

gunakan x=as.name("string") yang bisa Anda gunakan kemudian gunakan xuntuk merujuk ke variabel dengan string nama.

Saya tidak tahu apakah itu menjawab pertanyaan Anda dengan benar

saiteja
sumber
2
x=as.symbol("string")
Enrique Pérez Herrero
18

Fungsi yang Anda cari adalah get():

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

Memastikan bahwa alamat memori identik:

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

Referensi: R FAQ 7.21 Bagaimana cara mengubah string menjadi variabel?

Jozef Janočko
sumber
1
Bagus! Ini adalah jawaban paling ringkas yang saya temukan. Apakah ada cara ringkas serupa untuk melakukan kebalikannya? sepertix <- 42; deparse(substitute(x))
Miao Cai
10

strsplituntuk mengurai masukan Anda dan, seperti yang disebutkan Greg, assignuntuk menetapkan variabel.

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()
Richie Cotton
sumber
5

assignbagus, tetapi saya belum menemukan fungsi untuk merujuk kembali ke variabel yang Anda buat dalam skrip otomatis. ( as.namesepertinya bekerja sebaliknya). Pembuat kode yang lebih berpengalaman pasti akan memiliki solusi yang lebih baik, tetapi solusi ini berfungsi dan mungkin sedikit lucu, karena ia membuat R menulis kode untuk dieksekusi sendiri.

Katakanlah saya baru saja menetapkan nilai 5 ke x( var.name <- "x"; assign(var.name, 5)) dan saya ingin mengubah nilainya menjadi 6. Jika saya menulis skrip dan tidak tahu sebelumnya apa nama variabel ( var.name) nantinya (yang tampaknya menjadi inti dari assignfungsi), saya tidak bisa begitu saja x <- 6karena var.namemungkin saja "y". Jadi saya lakukan:

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

xakan diubah menjadi 6, dan jika nama variabel adalah selain dari "x", variabel itu juga akan diubah menjadi 6.

CJB
sumber
2

Saya bekerja dengan ini beberapa hari yang lalu, dan memperhatikan bahwa terkadang Anda perlu menggunakan get()fungsi untuk mencetak hasil variabel Anda. yaitu:

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

Dari sana, jika Anda mencoba mencetak variabel varnames[1], ia mengembalikan 'jan'. Untuk menyiasatinya, Anda perlu melakukannya print(get(varnames[1]))

eigenfoo.dll
sumber
1

Mungkin saya tidak mengerti masalah Anda dengan benar, karena kesederhanaan teladan Anda. Menurut pemahaman saya, Anda memiliki serangkaian instruksi yang disimpan dalam vektor karakter, dan instruksi tersebut sangat dekat dengan format yang benar, kecuali Anda ingin memasukkan anggota yang tepat ke numerik.

Jika pemahaman saya benar, saya ingin mengusulkan pendekatan yang sedikit berbeda, yang tidak bergantung pada pemisahan string asli Anda, tetapi langsung mengevaluasi instruksi Anda (dengan sedikit perbaikan).

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

Pada dasarnya, yang kami lakukan adalah kami 'meningkatkan' instruksi Anda variable_name="10"sehingga menjadi variable_name="10" %>% as.numeric, yang setara variable_name=as.numeric("10")dengan magrittrsintaks pipa-aliran. Kemudian kami mengevaluasi ungkapan ini dalam lingkungan saat ini.

Harapan itu membantu seseorang yang berkeliaran di sini 8 tahun kemudian ;-)

Vongo
sumber
0

Jika Anda ingin mengonversi string menjadi variabel di dalam tubuh fungsi, tetapi Anda ingin memiliki variabel global:

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

[1] "xxx"
adam borkowski
sumber