2

zooom関数(ユーザーがズームの左端と右端の境界をクリックしてチャートのズームをインタラクティブに変更できるようにする)を呼び出した後、結果のサブセットを表示することは可能ですか?

私がこれを望む理由:

  1. 自動yrangeは、chartSeriesへの元の呼び出しに渡された時系列のみに基づいているため、追加したカスタムTAに基づいてチャートに適切なyrangeを設定します。
  2. チャートを左右にパンする関数を実装するには

現在のサブセットの取得を伴わないこれら2つの目標の回避策も役立ちます。現在私が考えることができる唯一のオプションは、インタラクティブなzooom関数の使用を避け、chartZoomを使用することです。

4

1 に答える 1

1

最初に知っておくべきことは、なぜzoomChart()必要な値を返すのに、返さないのかということですzooom()

zoomChart()reChart()行で終わる関数を呼び出すためinvisible(chob)です。(chobはあなたが探しているオブジェクトの名前です。)

zooom()これをしません。を呼び出しますが、評価されている環境から抜け出すようにzoomChart()は調整されていません。ただし、の修正バージョンを作成することで、それを行うことができます。chobzoomChart()zooom()

これを行うには、最初にファイルにダンプzooomしてから、次のように編集された関数を作成しますzooom2

require(quantmod)
dump("zooom", file="zooom2.R")

私が行った3つの編集は次のとおりです。

  1. get.chob()の呼び出しをへの呼び出しに置き換えますquantmod:::get.chob()。これが必要なのは、とは異なりzooom、それを囲む環境zooom2がないためです。namespace:quantmod

  2. zoomChart()の出力をオブジェクトに割り当てますchob

  3. chob関数を。で終了して、呼び出し元の環境に戻りinvisible(chob)ます。

変更された関数は次のとおりです。

zooom2 <-
function (n = 1, eps = 2) 
{
for (i in 1:n) {
    cat("select left and right extremes by clicking the chart\n")
    points <- locator(2)
    if (abs(diff(points$x)) < eps) {
    zoomChart()
    }
    else {
    usr <- par("usr")
    xdata <- quantmod:::get.chob()[[2]]@xdata
    xsubset <- quantmod:::get.chob()[[2]]@xsubset
    sq <- floor(seq(usr[1], usr[2], 1))
    st <- which(floor(points$x[1]) == sq)/length(sq) * 
        NROW(xdata[xsubset])
    en <- which(floor(points$x[2]) == sq)/length(sq) * 
        NROW(xdata[xsubset])
    sorted <- sort(c(st, en))
    st <- sorted[1]
    en <- sorted[2] * 1.05
    chob <- zoomChart(paste(index(xdata[xsubset])[max(1, floor(st), 
        na.rm = TRUE)], index(xdata[xsubset])[min(ceiling(en), 
        NROW(xdata[xsubset]), na.rm = TRUE)], sep = "::"))
    }
}
cat("done\n")
invisible(chob)

}

関数をソースするか、Rセッションに貼り付けて、次のように使用できます(たとえば)。

  data(sample_matrix)
  chartSeries(sample_matrix)
  d <- zooom2()
  # Click to interactively zoom in

  # extract the data visible in the selected region
  d_sub <- d@xdata[d@xsubset,]
  head(d_sub)
#                Open     High      Low    Close
# 2007-03-28 48.33090 48.53595 48.33090 48.53595
# 2007-03-29 48.59236 48.69988 48.57432 48.69988
# 2007-03-30 48.74562 49.00218 48.74562 48.93546
# 2007-03-31 48.95616 49.09728 48.95616 48.97490
# 2007-04-01 48.94407 48.97816 48.80962 48.87032
# 2007-04-02 48.90488 49.08400 48.90488 49.06316

これが便利な場合は、quantmodソースに追加して、独自のバージョンのパッケージを再コンパイルすることをお勧めします。

お役に立てれば。

于 2011-11-02T22:17:52.567 に答える