Получение подмножества для QuantMod ChartSeries после вызова ZOOOM - PullRequest
3 голосов
/ 02 ноября 2011

После вызова функции zooom (которая позволяет пользователю в интерактивном режиме изменять масштаб графика, щелкая крайние левые и крайние правые границы для увеличения), возможно ли отобразить результирующее подмножество?

Причины, по которым я хочу это:

  1. Чтобы установить подходящее значение yrange для моего графика на основе добавленных мной пользовательских TA, которые в противном случае не были бы видны, потому что автоматический yrange основан только на временных рядах, переданных исходному вызову chartSeries
  2. Для реализации функций панорамирования графика влево и вправо

Обходные пути для этих двух целей, которые не включают получение текущего подмножества, также будут полезны. В настоящее время я могу думать только о том, чтобы избежать использования интерактивной функции zooom и просто использовать chartZoom.

1 Ответ

2 голосов
/ 03 ноября 2011

Первое, что нужно знать, это то, почему zoomChart() возвращает нужные значения, а zooom() - нет.

zoomChart() - потому что вызывает функцию reChart(), которая заканчивается налиния invisible(chob).(chob - это имя объекта, который вы ищете.)

zooom() этого не делает.Он вызывает zoomChart(), но не организует передачу chob из среды, в которой оценивается zoomChart().Вы можете сделать это, хотя, создав модифицированную версию zooom()

Я сделал это, сначала выгрузив zooom в файл, а затем создав отредактированную функцию с именем zooom2:

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

Я сделал три правки:

  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 источникам и перекомпилировать свою собственную версию пакета.

Надеюсь, это поможет.

...