Converte una stringa in un nome di variabile


100

Sto usando R per analizzare un elenco di stringhe nella forma:

original_string <- "variable_name=variable_value"

Innanzitutto, estraggo il nome e il valore della variabile dalla stringa originale e converto il valore in una classe numerica.

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

Quindi, vorrei assegnare il valore a una variabile con lo stesso nome della stringa nome_parametro.

variable_name <- parameter_value

Qual è / sono le funzioni per farlo?

Risposte:



66

Puoi usare do.call:

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

10
+1 per pensare. Le persone (me compreso) di solito dimenticano che <-è una funzione in sé.
Rob


20

use x=as.name("string") è possibile utilizzare quindi utilizzare xper fare riferimento alla variabile con la stringa del nome.

Non so se risponde correttamente alla tua domanda


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

18

La funzione che stai cercando è get():

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

Confermando che l'indirizzo di memoria è identico:

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

Riferimento: R FAQ 7.21 Come posso trasformare una stringa in una variabile?


1
Grande! Questa è la risposta più concisa che ho trovato. C'è un modo altrettanto conciso per fare il contrario? proprio comex <- 42; deparse(substitute(x))
Miao Cai

10

strsplitper analizzare il tuo input e, come ha detto Greg, assignper assegnare le variabili.

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

assignva bene, ma non ho trovato una funzione per fare riferimento alla variabile che hai creato in uno script automatizzato. ( as.namesembra funzionare al contrario). I programmatori più esperti avranno senza dubbio una soluzione migliore, ma questa soluzione funziona ed è forse un po 'divertente, in quanto fa in modo che R scriva il codice per se stesso da eseguire.

Diciamo che ho appena assegnato il valore 5 a x( var.name <- "x"; assign(var.name, 5)) e voglio cambiare il valore in 6. Se sto scrivendo uno script e non so in anticipo quale sarà il nome della variabile ( var.name) (che sembra essere il punto assignfunzione), non posso semplicemente mettere x <- 6perché var.nameavrebbe potuto essere "y". Faccio così:

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

xsarà cambiato in 6, e se il nome della variabile era diverso da "x", quella variabile sarà stata modificata in modo simile in 6.


2

Ci stavo lavorando alcuni giorni fa, e ho notato che a volte dovrai usare la get()funzione per stampare i risultati della tua variabile. cioè:

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

Da lì, se provi a stampare la variabile varnames[1], restituisce "jan". Per ovviare a questo, devi farlo print(get(varnames[1]))


1

Forse non ho capito bene il tuo problema, a causa della semplicità del tuo esempio. A quanto mi risulta, hai una serie di istruzioni memorizzate in vettori di caratteri e quelle istruzioni sono molto vicine ad essere formattate correttamente, tranne per il fatto che vorresti convertire il membro giusto in numerico.

Se la mia comprensione è corretta, vorrei proporre un approccio leggermente diverso, che non si basa sulla divisione della stringa originale, ma valuta direttamente le tue istruzioni (con un piccolo miglioramento).

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

In sostanza, quello che stiamo facendo è che noi 'migliorare' la vostra istruzione variable_name="10"in modo che diventi variable_name="10" %>% as.numeric, che è l'equivalente di variable_name=as.numeric("10")con magrittrla sintassi del tubo-stream. Quindi valutiamo questa espressione nell'ambiente corrente.

Spero che questo aiuti qualcuno che vagherebbe qui intorno 8 anni dopo ;-)


0

Se vuoi convertire una stringa in una variabile all'interno del corpo della funzione, ma vuoi avere una variabile globale:

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

[1] "xxx"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.