同様の問題があるため、この質問に提供されているものよりも一般化された解決策を探しています:言語オブジェクトのシンボルを置き換えるにはどうすればよいですか?
評価されていない式があります。foo <- quote(bar + baz)
これは、他の式内の変数ですqux <- quote(bla + foo)
。
次のことを確認できます。
exists("foo", envir=.GlobalEnv) & class(foo)=="call"
[1] TRUE
exists("qux", envir=.GlobalEnv) & class(qux)=="call"
[1] TRUE
qux
ここで、コンポーネント式に分解 (解析?) し、に存在するものとクラスのものをそれらの値で置き換える一般化された関数を書きたいと思います。.GlobalEnv
call
replaceFUN <- function(x) {
# do something
}
実行replaceFUN(qux)
すると次が返されます。
bla + (bar + baz)
実際の問題の背景:
クオンツ取引ルールのバックテスト エンジンを構築しています。私の目的は、ルールやインジケーターの計算など、quote()d 式の評価を定義後に遅らせることです。
require(data.table)
require(TTR) # for the `SMA` function
DT <- data.table(Instrument=rep("SPX",3),Date=1:3, Close=c(1050, 1052, 1051))
# define parameters
nSMA <-2
t <- 2
# define indicators
time.filter <- quote( Date==t )
moving.average <- quote( SMA(Close, nSMA) )
buy <- quote( Close > moving.average & time.filter )
AddColumn <- function(x, colname) {
DT[,eval(substitute(colname)):=eval(x, envir=.SD)]
}
AddColumn(time.filter, "filter")
Instrument Date Close filter
1: SPX 1 1050 FALSE
2: SPX 2 1052 TRUE
3: SPX 3 1051 FALSE
AddColumn(moving.average, "MA")
Instrument Date Close filter MA
1: SPX 1 1050 FALSE NA
2: SPX 2 1052 TRUE 1051.0
3: SPX 3 1051 FALSE 1051.5
AddColumn(buy, "Buy")
Error in Close > moving.average & time.filter :
operations are possible only for numeric, logical or complex types
これは明らかにエラーを発生させます。これは、ネストされた変数と変数 (およびユーザーが定義してAddColumn
ネストしたその他の変数) を解析するメカニズムが関数にないためです。内部のルールのネストは読みやすさのために行われており、実際には構文糖衣です。moving.average
time.filter
buy