文字列を変数名に変換します


100

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

original_string <- "variable_name=variable_value"

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

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

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

variable_name <- parameter_value

これを行うための機能は何ですか?

回答:


122

割り当てはあなたが探しているものです。

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


「バイヤーは用心してください」というのは、与えられた問題の良い解決策となることはほとんどないので、これを行うことはほとんどありませんと言って、かなり風刺的な方法です。
Konrad Rudolph

66

do.callを使用できます。

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

10
考えるための+1。人々(私を含む)は通常、それ<-が関数そのものであることを忘れます。
Rob、


20

使用しx=as.name("string") 、使用後、使用することができますx名前の文字列で変数を参照すること。

それがあなたの質問に正しく答えれば私は知りません


2
x=as.symbol("string")
EnriquePérezHerrero 2015

18

あなたが探している機能はget()

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

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

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

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


1
すごい!これは私が見つけた最も簡潔な答えです。逆を行うための同様に簡潔な方法はありますか?ちょうどのようなx <- 42; deparse(substitute(x))
ミャオ族カイ

10

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

5

assign良いですが、自動スクリプトで作成した変数を参照する関数は見つかりませんでした。(as.name反対の方法で動作するようです)。経験豊富なコーダーには間違いなくより良い解決策がありますが、この解決策は機能し、Rにコードを記述して実行させるという点で、少しユーモラスです。

xvar.name <- "x"; assign(var.name, 5))に値5を割り当て、値を6に変更したいとします。スクリプトを作成していて、変数名(var.name)が何であるかを事前に知らない場合(これがポイントのようです)assign関数)、されている可能性があるx <- 6ため、単純に置くことvar.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に変更されます。


2

私は数日前にこれを使っていました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]))


1

多分私はあなたの例の単純さのためにあなたの問題を正しく理解していませんでした。私の理解では、一連の命令は文字ベクトルに格納されており、これらの命令は適切なフォーマットに非常に近いですが、正しいメンバーを数値にキャストしたいという点が異なります。

私の理解が正しければ、元の文字列を分割するのではなく、少し改善を加えて直接命令を評価する、少し異なるアプローチを提案したいと思います。

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

基本的には、パイプストリーム構文と同等のにvariable_name="10"なるように命令を「改善」することです。次に、現在の環境でこの式を評価します。variable_name="10" %>% as.numericvariable_name=as.numeric("10")magrittr

それが8年後にここをさまよっている人を助けることを願っています;-)


0

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

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

[1] "xxx"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.