Получение подмножества для quantmod chartSeries после вызова zooom

#r #quantmod

#r #quantmod

Вопрос:

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

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

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

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

Комментарии:

1. Я обнаружил, что chartSeries возвращает объект, в котором есть атрибуты, указывающие различные сведения о диаграмме, включая атрибут xrange, который указывает на временные ряды. Однако атрибуты исходного объекта, возвращаемые chartSeries, похоже, не изменяются при вызове zooom, и zooom ничего не возвращает.

2. Извините за ошибку редактирования, теперь я знаю, что на самом деле есть функция с правописанием zooom

Ответ №1:

Первое, что нужно знать, это почему 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 chartn")
    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("donen")
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 исходные тексты и перекомпилировать свою собственную версию пакета.

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

Комментарии:

1. Это сработало отлично. Я новичок в R, поэтому я понятия не имел о функции дампа, очень полезной.