2011-05-17 21 views
60

estoy usando R para analizar una lista de cadenas en la forma:Convierte una cadena a un nombre de variable

original_string <- "variable_name=variable_value" 

En primer lugar, extraer el nombre de la variable y el valor de la cadena original y convertir el valor a la clase numérica .

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

Entonces, me gustaría asignar el valor a una variable con el mismo nombre que la cadena parameter_name.

variable_name <- parameter_value 

¿Cuál es/son la (s) función (es) para hacer esto?

Respuesta

8

strsplit para analizar su entrada y, como se mencionó Greg, assign para asignar las variables.

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

Puede utilizar do.call:

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

+1 por pensar.Las personas (yo incluido) suelen olvidar que '<-' es una función en sí misma. – Rob

12

uso x = as.name ("cadena") puede utilizar luego usar x para hacer referencia a la variable con la cadena de nombre.

no sé si responde a su pregunta

+1

'x = as.symbol (" cadena ")' –

4

assign es buena, pero no he encontrado una función para referirse de nuevo a la variable que ha creado en un script automatizado. (as.name parece funcionar de la manera opuesta). Los codificadores más experimentados tendrán, sin duda, una mejor solución, pero esta solución funciona y es un poco humorística, tal vez, hace que R escriba código para ejecutar.

Decir simplemente he asignado value 5 a x (var.name <- "x"; assign(var.name, 5)) y quiero cambiar el valor a 6. Si estoy escribiendo un guión y no sé de antemano cuál será el nombre de la variable (var.name) (que parece ser el punto de la función assign), no puedo simplemente poner x <- 6 porque var.name podría haber sido "y". Así que hago:

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 se cambiará a 6, y si el nombre de la variable era otra cosa que no sea "x", dicha variable se han cambiado de manera similar a 6.

Cuestiones relacionadas