Konvertieren Sie eine Zeichenfolge in einen Variablennamen


100

Ich verwende R, um eine Liste von Zeichenfolgen in der folgenden Form zu analysieren:

original_string <- "variable_name=variable_value"

Zuerst extrahiere ich den Variablennamen und den Wert aus der ursprünglichen Zeichenfolge und konvertiere den Wert in eine numerische Klasse.

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

Dann möchte ich den Wert einer Variablen mit demselben Namen wie die Zeichenfolge parameter_name zuweisen.

variable_name <- parameter_value

Was ist / sind die Funktion (en) dafür?

Antworten:



65

Sie können do.call verwenden:

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

10
+1 zum Nachdenken. Leute (ich eingeschlossen) vergessen normalerweise, dass dies <-eine Funktion selbst ist.
Rob


19

Mit use können x=as.name("string") Sie dann xauf die Variable mit der Namenszeichenfolge verweisen.

Ich weiß nicht, ob es Ihre Frage richtig beantwortet


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

18

Die gesuchte Funktion ist get():

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

Bestätigen, dass die Speicheradresse identisch ist:

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

Referenz: R FAQ 7.21 Wie kann ich einen String in eine Variable verwandeln?


1
Toll! Dies ist die prägnanteste Antwort, die ich gefunden habe. Gibt es eine ähnlich prägnante Möglichkeit, das Gegenteil zu tun? genau wiex <- 42; deparse(substitute(x))
Miao Cai

10

strsplitum Ihre Eingabe zu analysieren und, wie Greg erwähnte, assigndie Variablen zuzuweisen.

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

assignist gut, aber ich habe keine Funktion gefunden, um auf die Variable zurückzugreifen, die Sie in einem automatisierten Skript erstellt haben. ( as.namescheint umgekehrt zu funktionieren). Erfahrene Codierer werden zweifellos eine bessere Lösung haben, aber diese Lösung funktioniert und ist vielleicht etwas humorvoll, da sie R dazu bringt, Code für sich selbst zu schreiben, um ihn auszuführen.

Angenommen, ich habe gerade den Wert 5 zugewiesen x ( var.name <- "x"; assign(var.name, 5)) und möchte den Wert auf 6 ändern. Wenn ich ein Skript schreibe und nicht im Voraus weiß, wie der Variablenname ( var.name) lauten wird (was der Sinn des zu sein scheint) assignFunktion), kann ich nicht einfach sagen, x <- 6weil es var.namegewesen sein könnte "y". So ich mache:

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

xwird in 6 geändert, und wenn der Variablenname etwas anderes als war "x", wurde diese Variable ebenfalls in 6 geändert.


2

Ich habe vor einigen Tagen damit gearbeitet und festgestellt, dass Sie manchmal die get()Funktion verwenden müssen, um die Ergebnisse Ihrer Variablen zu drucken. dh:

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

Wenn Sie von dort aus versuchen, die Variable zu drucken varnames[1], wird 'jan' zurückgegeben. Um dies zu umgehen, müssen Sie dies tun print(get(varnames[1]))


1

Vielleicht habe ich Ihr Problem aufgrund der Einfachheit Ihres Beispiels nicht richtig verstanden. Nach meinem Verständnis haben Sie eine Reihe von Anweisungen in Zeichenvektoren gespeichert, und diese Anweisungen sind fast richtig formatiert, außer dass Sie das richtige Element in numerisch umwandeln möchten.

Wenn mein Verständnis stimmt, möchte ich einen etwas anderen Ansatz vorschlagen, der nicht auf der Aufteilung Ihrer ursprünglichen Zeichenfolge beruht, sondern Ihre Anweisung direkt bewertet (mit einer kleinen Verbesserung).

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

Grundsätzlich tun wir, dass wir Ihren Unterricht variable_name="10"so "verbessern" , dass er zu variable_name="10" %>% as.numericeinem Äquivalent von variable_name=as.numeric("10")mit wirdmagrittr Rohr-Stream - Syntax. Dann bewerten wir diesen Ausdruck in der aktuellen Umgebung.

Hoffe das hilft jemandem, der 8 Jahre später hier herumwandert ;-)


0

Wenn Sie einen String in eine Variable innerhalb des Funktionskörpers konvertieren möchten, aber eine globale Variable haben möchten:

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

[1] "xxx"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.