Dizeyi değişken adına dönüştür


100

Formdaki dizelerin listesini ayrıştırmak için R kullanıyorum:

original_string <- "variable_name=variable_value"

İlk olarak, değişken adını ve değerini orijinal dizeden çıkarıyorum ve değeri sayısal sınıfa dönüştürüyorum.

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

Ardından, değeri parametre_adı dizesi ile aynı ada sahip bir değişkene atamak istiyorum.

variable_name <- parameter_value

Bunu yapmak için işlev (ler) nedir / nelerdir?

Yanıtlar:



67

Do.call'ı kullanabilirsiniz:

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

11
Düşünmek için +1. İnsanlar (ben dahil) genellikle bunun <-bir işlev olduğunu unuturlar .
Rob


20

kullanın ve sonra değişkene isim dizesi ile başvurmak için x=as.name("string") kullanabilirsiniz x.

Sorunuzu doğru cevaplıyor mu bilmiyorum


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


10

strsplitgirdinizi ayrıştırmak ve Greg'in bahsettiği gibi assigndeğişkenleri atamak için.

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

assigniyidir, ancak otomatikleştirilmiş bir komut dosyasında oluşturduğunuz değişkene geri başvurmak için bir işlev bulamadım. ( as.nameters yönde çalışıyor gibi görünüyor). Daha deneyimli kodlayıcılar şüphesiz daha iyi bir çözüme sahip olacaklardır, ancak bu çözüm işe yarıyor ve belki de biraz esprili, çünkü çalıştırması için kod yazması R alıyor.

Diyelim ki 5'e x( var.name <- "x"; assign(var.name, 5)) değerini atadım ve değeri 6 olarak değiştirmek istiyorum. Bir komut dosyası yazıyorsam ve değişken adının ( var.name) ne olacağını önceden bilmiyorsam (bu, assignişlevi), basitçe ifade edemem x <- 6çünkü var.nameolabilirdi "y". Ben de yapıyorum:

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

x6 olarak değiştirilecek ve değişken adı dışında herhangi bir şey ise "x", bu değişken benzer şekilde 6 olarak değiştirilecektir.


2

Birkaç gün önce bununla çalışıyordum ve bazen get()değişkeninizin sonuçlarını yazdırmak için işlevi kullanmanız gerekeceğini fark ettim . yani:

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

Oradan, değişkeni yazdırmaya çalışırsanız varnames[1], 'jan' döndürür. Bunu aşmak için yapmanız gerekenler print(get(varnames[1]))


1

Belki de örneğinizin basitliğinden dolayı probleminizi doğru anlamadım. Anladığım kadarıyla, karakter vektörlerinde saklanan bir dizi talimatınız var ve bu talimatlar, doğru üyeyi sayısal hale getirmek istemeniz dışında, doğru şekilde biçimlendirilmeye çok yakın.

Anladığım doğruysa, biraz farklı bir yaklaşım önermek isterim, bu orijinal dizenizi bölmeye dayanmaz, ancak talimatınızı doğrudan değerlendirir (biraz iyileştirme ile).

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

Temelde, ne yapıyoruz biz talimat 'geliştirmek' olduğunu variable_name="10"o olur böylece variable_name="10" %>% as.numericbir eşdeğerdir variable_name=as.numeric("10")ile magrittrboru akışı sözdizimi. Daha sonra bu ifadeyi mevcut ortam içerisinde değerlendiriyoruz.

Umarım bu, 8 yıl sonra burada dolaşan birine yardımcı olur ;-)


0

Dizeyi işlev gövdesi içindeki değişkene dönüştürmek istiyorsanız, ancak değişken global olmasını istiyorsanız:

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

[1] "xxx"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.