REvaluate[code]
R言語コードの文字列を評価し,結果をWolfram言語式として返す.
REvaluate
REvaluate[code]
R言語コードの文字列を評価し,結果をWolfram言語式として返す.
詳細とオプション
- コード code は,有効なR言語コードの文字列でなければならない.このコードは実行後,REvaluateで処理できる型のいずれかで結果を生成する.
- 以下は,RLinkが明示的にサポートするR言語の型である.これらの要素は,要素を表す式の内部的な RLink 頭部とともに,REvaluateが返すことができる:
-
"integer" RVector "double" RVector "complex" RVector "logical" RVector "character" RVector "list" RList "NULL" RNull "closure" RFunction "builtin" RFunction "environment" REnvironment - 明示的にサポートされる型以外の型はほとんど,それらを文字列(解析されたR言語コード)に変換することによって,RからWolfram言語にインポートすることができる.そのような要素は,RCodeラッパーで囲む.
- 現在"environment"の型は部分的にしかサポートされていない.つまり,大域的な環境を表すために,RからWolfram言語に明示的にエキスポートされた環境オブジェクトをすべて考慮する.
- REvaluateに渡されたコードがREvaluateで処理できない型で評価しようとした場合,REvaluateは$Failedを返す.
例題
すべて開く すべて閉じる例 (11)
Needs["RLink`"]
InstallR[]10個の連続する整数のリスト(R言語のベクトル)を構築する:
REvaluate["1:10"]Rで一般的なベクトルコンストラクタを使って,数のベクトルを構築する:
REvaluate["c(c(1,2),c(3,4))"]出力を非表示にする場合には,あるいは出力が不要である場合には,R言語コードの最後にセミコロンを入れればよい.その場合,REvaluateはNullを返す:
REvaluate["c(c(1,2),c(3,4));"]スカラーが入力された場合には,これは自動的に長さ1のベクトルであるとR言語が見なす.このことはRLinkにも反映される:
REvaluate["5"]デフォルトでは,真の数値量はdouble型であると見なされる:
REvaluate["typeof(5)"]Rがこれらを整数として解釈するようにする方法の1つとして,Rのas.integer関数を使う方法がある:
REvaluate["as.integer(5)"]REvaluate["seq(0,pi,by=0.2)"]Range[0, Pi, 0.2]上の例にある数列について正弦関数を計算する.(Wolfram言語の場合と同様に,Rでの関数のほとんどはベクトル化される):
REvaluate["sin(seq(0,pi,by=0.2))"]これは同じであるが,明示的な関数のマッピング(Rのsapplyは,Wolfram言語のMapに対応する)を使っている:
REvaluate["sapply(seq(0,pi,by=0.2),sin)"]2つ目の方法のほうが時間がかかるが,これはWolfram言語の場合も同じである:
REvaluate["largeSeq <- seq(0,2*pi,0.0001)"]//Short
REvaluate["sin(largeSeq)"]//Short//AbsoluteTiming
REvaluate["sapply(largeSeq,sin)"]//Short//AbsoluteTimingこれはもう少し複雑な例である.ここでは,独立変数の値を取り,それを関数(ここでは正弦関数)の値をベクトルでラップして一緒に返す関数をマップする:
REvaluate["t(sapply(seq(0,pi,by=0.2),function(nm){c(nm,sin(nm))}))"]これは,上の例からの割当ての右辺をWolfram言語で行った場合である:
Map[{#, Sin[#]}&, Range[0, Pi, 0.2]]REvaluate内部でR言語コードのより大きな部分を使うこともできる.しかしその場合には,命令文をブロック(中カッコ)でラップしたほうがよい.以下はその例である:
REvaluate["
{
x <- c(0,1,1,2,3,5,8,13,21,34)
mx<- mean(x)
medx<-median(x)
sdx <- sd(x)
varx<- var(x)
results <-c(mx,medx,sdx,varx)
}"]これは文字列を分割し,実際にベクトルではなくリストを返す.このことは,余分な中カッコが使われていることから分かる:
REvaluate["strsplit(\"This is a test message\",NULL)"]mat = REvaluate["rmat <- array(sample(1:15, 16, replace = TRUE, prob = NULL),dim = c(4,4))"]REvaluate["esys <- eigen(rmat,sym = FALSE)"]結果は,R言語のリストであり,非空の属性集合(属性names)であるので,頭部RObjectを持つ一般的なR言語オブジェクトして表されることが分かる.このことについては,「RLinkにおけるR言語データの型」およびRObjectについての関数ページに詳しく説明されている.
REvaluate["esys$vectors"]REvaluate["esys$values"]これはWolfram言語においても同じである(ただし,この場合に固有ベクトルが必ずしも同じである必要はない):
Eigensystem[N@mat]testVector = Partition[RandomInteger[10, 12], 3]RSet["testVector", testVector]この要素について論理的な比較の結果は,論理ベクトル(行列)である:
REvaluate["lvec <- testVector>5"]REvaluate["typeof(lvec)"]REvaluate["objects()"]スコープ (8)
割当て (3)
Needs["RLink`"]
InstallR[]REvaluateを使って割当てを行うこともできる.例えば,Rのワークスペースにおいて大域変数myintに次の割当てを行う:
REvaluate["myint <- 1:10"]これでREvaluateを使って,新しく作成された大域変数myintの内容をチェックすることができる:
REvaluate["myint"]myFun = REvaluate["myFun <- function(x){x^2}"]この参照は,(Rでこの関数に名前を与えたので)Rで使うことができる:
REvaluate["myFun(5)"]myFun[5]割当てを作成するが,その結果をWolfram言語に返さないようにするためには,最後にセミコロンを加えて,出力を非表示にすればよい:
REvaluate["myFun1 <- function(x){x^4};"]REvaluate["myFun1(3)"]多次元配列 (3)
一次元配列の場合と同じくらい簡単に,REvaluateは多次元配列も処理できるが,気を付けなければいけないことがいくつかある.
arr = REvaluate["arr <- array(1:20, dim = c(5,2,2))"]Rは,列に主要をおいた順序で配列を保存するので,返された結果が予期していたものとは異なるかもしれない.しかし,配列インデックスを付ける際の一貫性という点でこれは必要である:
arr[[1]]REvaluate["arr[1,,]"]arr[[All, 1]]REvaluate["arr[,1,]"]配列を行に主要をおいた順序(Wolfram言語で使われる順序)に変換するには,Transposeを使えばよい:
convertToRowMajor[arr_] := Transpose[arr, Reverse@Range@Length@Dimensions@arr]rmarr = convertToRowMajor[arr]Dimensions[rmarr]REvaluate["arr[,1,1]"]convertToRowMajor[arr][[1, 1, All]]上のような問題は,Rで作成された配列をWolfram言語に送信したときにだけ起るものである.Wolfram言語で配列を作ってからそれをRに送信すると,それは自動的に列を主要とした順序に変換され,Rが返された場合には行を主要とした順序に戻される.したがって,そのような場合にはもとの配列が返されることになる.
marr = Map[Partition[#, 2]&, Partition[Range[20], 4]]RSet["marr", marr];REvaluate["marr"]前と同じようにインデックスはWolfram言語で行われる形と同じである:
REvaluate["marr[1,,]"]marr[[1]]つまりWolfram言語配列をRに送信し,それをWolfram言語で使う場合と同じようにRで使い続けることができるということである.
もう一つの例として,行列操作を考えてみよう.まず,Wolfram言語で行列を構築する:
mmat = Partition[Range[20], 4]今度はそれをRに送信し,Rのワークスペースで変数mmatに割り当てる:
RSet["mmat", mmat]REvaluate["mmat %*% t(mmat)"]mmat.Transpose[mmat]特別の数量:NaNと無限大 (1)
Needs["RLink`"]
InstallR[]NaNおよびさまざまな種類の無限大のような特別の数量に対しては,現在一方向性のサポートが存在する.
次のRの入力は,さまざまな数量がどのようにWolfram言語内で変換されるかを示す.これはRのコンソールで直接得られるものである:
REvaluate[" as.character(c(1,sqrt(-1),1/0,-1/0,(1+1i)/0))"]REvaluate["c(1,sqrt(-1),1/0,-1/0,(1+1i)/0)"]複素数の結果を得るために,負の数の平方根を取る場合には,その数ははっきり複素数として入力されなければならない:
REvaluate["sqrt(-1+0i)"]そのような数量をRからWolfram言語に得ることはサポートされているが,逆の操作は現在サポートされていない:
RSet["myTest", REvaluate["as.list(c(1,sqrt(-1),1/0,-1/0,(1+1i)/0))"]]欠落点 (1)
Needs["RLink`"]
InstallR[]Rのベクトルとリストは欠落点をサポートする.Wolfram言語では,そのような点はMissing[]で表される.
mvec = REvaluate["mvec <- c(1,2,NA,3,NA,NA,5)"]REvaluate["list(1,2,NA,3,NA,NA,5)"]欠落している要素に対してほとんどの関数が行う操作は,別の欠落要素を生成することである.以下はその例である:
REvaluate["mvec^2"]RLink では,欠落点は双方向のサポートを得る.例えば,ここでは上の例と同じ計算が行われるが,データはWolfram言語からRに送られている:
REvaluate["function(x){x^2}"][mvec]しかし,「関数」にも記載されているさまざまな理由により,以下のシンタックスを使う方がずっと望ましい:
RFunction["function(x){x^2}"][mvec]一般化と拡張 (2)
自分の関数を定義する (1)
Needs["RLink`"]
InstallR[]これは,Wolfram言語のTuples関数をR言語に実装し,3つ一組の数をデータの枠組みとして返す例である:
REvaluate["tuples <- function(x, n) do.call(expand.grid, rep(list(x), n));"]REvaluate["tuples(0:1, 3)"]R側のR言語オブジェクトと一般的なR言語オブジェクトを操作する (1)
Needs["RLink`"]
InstallR[]Rのすべてのオブジェクトは,1つあるいは複数の属性を持つことができる.RLink では,一般的な属性を持つR言語オブジェクトは,頭部RObjectを持つWolfram言語式でWolfram側では表される.これはいくつかの面でREvaluateにも影響を与える.
Wolfram言語で行列を構築し,これをR言語に送って,Rのワークスペースで変数myIntに割り当てる:
RSet["myInt", Partition[Range[20], 5]]変数に保存される結果のR言語オブジェクトのクラスを調べることができる:
REvaluate["class(myInt)"]任意のR言語オブジェクトの属性は,Rのリストに保存される.クラスmatrixのオブジェクトは,少なくとも1つの属性"dim"を持ち,この属性は次元(次元自体は整数のベクトルとして表される)についての情報を保存する:
REvaluate["attributes(myInt)"]このリスト自体が属性,特に属性"names"を持つことが分かる.このため,リストは単にWolfram言語リストとして表すことはできず,頭部RObjectを持たなければならない.与えられた属性の値を素早く取り出す1つの方法として,Rのattr関数を使う方法がある:
REvaluate["attr(myInt,\"dim\")"]dim属性を修正することによって,REvaluateを使いR側で行列の自明でない再形成を行うことができる.例えば,行列を次元{2,5,2}である三次元配列に変換することができる:
REvaluate["attr(myInt,\"dim\") <- c(2,5,2)"]REvaluate["myInt"]ある時点で,新しい属性をmyIntに加えたい場合もあるかも知れない.以下はその例である:
REvaluate["attr(myInt,\"myAttr\") <- \"myAttrValue\""]REvaluate["myInt"]dim属性は暗黙である.いつでもRObjectに基づく一般的な表現を,属性を持たないオブジェクトにも使うことができる:
RSet["mySecondInt", RObject[{{{1, 13}, {11, 4}, {2, 14}, {12, 5}, {3, 15}}, {{6, 18}, {16, 9}, {7, 19}, {17, 10}, {8, 20}}}, RAttributes[]]];
REvaluate["mySecondInt"]テクニカルノート
-
▪
- RLinkの基本 ▪
- RLinkユーザガイド
テキスト
Wolfram Research (2012), REvaluate, Wolfram言語関数, https://reference.wolfram.com/language/RLink/ref/REvaluate.html.
CMS
Wolfram Language. 2012. "REvaluate." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/RLink/ref/REvaluate.html.
APA
Wolfram Language. (2012). REvaluate. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/RLink/ref/REvaluate.html
BibTeX
@misc{reference.wolfram_2026_revaluate, author="Wolfram Research", title="{REvaluate}", year="2012", howpublished="\url{https://reference.wolfram.com/language/RLink/ref/REvaluate.html}", note=[Accessed: 10-July-2026]}
BibLaTeX
@online{reference.wolfram_2026_revaluate, organization={Wolfram Research}, title={REvaluate}, year={2012}, url={https://reference.wolfram.com/language/RLink/ref/REvaluate.html}, note=[Accessed: 10-July-2026]}