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?

Jawaban:



66

Anda dapat menggunakan do.call:

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

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


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?


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

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.


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


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


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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.