web-dev-qa-db-fra.com

Convertir une chaîne en un nom de variable

J'utilise R pour analyser une liste de chaînes sous la forme:

original_string <- "variable_name=variable_value"

Tout d'abord, j'extrais le nom et la valeur de la variable de la chaîne d'origine et convertis la valeur en classe numérique. 

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

Ensuite, j'aimerais attribuer la valeur à une variable portant le même nom que la chaîne nom_paramètre.

variable_name <- parameter_value

Quelle est/sont la/les fonction (s) pour faire cela?

77
KnowledgeBone

attribuer est ce que vous recherchez.

assign("x", 5)

x
[1] 5

mais acheteur méfiez-vous.

Voir R FAQ 7.21 http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I- Tour- -variable_003f

102
Greg

Vous pouvez utiliser do.call:

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

Une autre solution simple existe: http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa -in-r/

Pour convertir une chaîne en une variable:

x <- 42
eval(parse(text = "x"))
[1] 42

Et le contraire:

x <- 42
deparse(substitute(x))
[1] "x"
38
JohnBee

utilisez x = as.name ("chaîne") vous pouvez ensuite utiliser x pour désigner la variable portant le nom chaîne 

Je ne sais pas si cela répond correctement à votre question

15
saiteja

strsplit pour analyser votre entrée et, comme Greg l'a mentionné, assign pour affecter les 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()
9
Richie Cotton

assign c'est bien, mais je n'ai pas trouvé de fonction pour renvoyer à la variable que vous avez créée dans un script automatisé. (as.name semble fonctionner dans le sens opposé). Les codeurs plus expérimentés auront sans doute une meilleure solution, mais cette solution fonctionne et est peut-être légèrement humoristique, en ce sens qu'elle oblige R à écrire du code pour lui-même à exécuter.

Supposons que je viens d’attribuer la valeur 5 à x (var.name <- "x"; assign(var.name, 5)) et que je souhaite changer la valeur à 6. Si j’écris un script et que je ne sais pas à l’avance quel sera le nom de la variable (var.name) (qui semble être le point de la fonction assign), je ne peux pas simplement mettre x <- 6 car var.name aurait pu être "y". Moi aussi:

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 sera changé en 6, et si le nom de la variable était autre que "x", cette variable aura également été changée en 6.

5
CJB

La fonction que vous recherchez est get():

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

Confirmer que l'adresse mémoire est identique:

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

Référence: R FAQ 7.21 Comment puis-je transformer une chaîne en une variable?

5
Jozef Janočko

Si vous voulez convertir une chaîne en variable dans le corps de la fonction, mais que vous voulez avoir une variable globale:

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

[1] "xxx"
0
adam borkowski

Je travaillais avec cela il y a quelques jours et j'ai remarqué que vous aurez parfois besoin d'utiliser la fonction get() pour imprimer les résultats de votre variable . 

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

A partir de là, si vous essayez d'imprimer la variable varnames[1], elle retourne 'jan'. Pour contourner ce problème, vous devez utiliser print(get(varnames[1]))

0
eigenfoo