web-dev-qa-db-ja.com

文字列を変数名に変換する

Rを使用して、次の形式の文字列のリストを解析しています。

original_string <- "variable_name=variable_value"

最初に、元の文字列から変数名と値を抽出し、値を数値クラスに変換します。

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

次に、parameter_name文字列と同じ名前の変数に値を割り当てたいと思います。

variable_name <- parameter_value

これを行うための関数は何ですか?

87
KnowledgeBone

assignはあなたが探しているものです。

assign("x", 5)

x
[1] 5

しかし、買い手は用心します。

R FAQ 7.21を参照してください http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into- a-variable_003f

109
Greg

Do.callを使用できます。

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

別の簡単な解決策があります: http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa- in-r /

文字列を変数に変換するには:

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

そしてその逆:

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

x = as.name( "string")を使用してから、xを使用してstringという名前の変数を参照できます。

あなたの質問に正しく答えられるかどうかわからない

15
saiteja

探している関数はget()です:

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

メモリアドレスが同一であることを確認します。

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

参照: R FAQ 7.21文字列を変数に変換するにはどうすればよいですか?

11
Jozef Janočko

strsplitは入力を解析し、Gregが述べたように、assignは変数を割り当てます。

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()
10
Richie Cotton

assignは良いのですが、自動スクリプトで作成した変数を参照するための関数が見つかりませんでした。 (as.nameは逆の方法で動作するようです)。経験豊富なコーダーには間違いなくより良いソリューションがありますが、このソリューションは動作し、Rが実行するコードをRに書き込むという点で、おそらく少しユーモラスです。

値5をxvar.name <- "x"; assign(var.name, 5))に割り当てたばかりで、値を6に変更したいとします。スクリプトを作成していて、変数名(var.name)を事前に知らない場合(assign関数のポイントと思われる)になります。x <- 6var.nameだった可能性があるため、単純に"y"を配置することはできません。私もです:

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は6に変更され、変数名が"x"以外の場合、その変数も同様に6に変更されます。

5
CJB

私はこれを数日前に使用していましたが、変数の結果を出力するためにget()関数を使用する必要がある場合があることに気付きました。すなわち:

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

そこから、変数varnames[1]を印刷しようとすると、「jan」が返されます。これを回避するには、print(get(varnames[1]))を実行する必要があります

2
eigenfoo

関数の本体内で文字列を変数に変換したいが、変数をグローバルにしたい場合:

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

[1] "xxx"
0
adam borkowski