#r #quantmod
#r #quantmod
Вопрос:
Возможно ли отобразить результирующее подмножество после вызова функции zooom (которая позволяет пользователю интерактивно изменять масштаб диаграммы, нажимая на крайнюю левую и крайнюю правую границы масштабирования)?
Причины, по которым я этого хочу:
- Чтобы установить соответствующий диапазон лет для моей диаграммы на основе пользовательских TA, которые я добавил, которые в противном случае не были бы видны, потому что автоматический диапазон лет основан только на временных рядах, переданных исходному вызову chartSeries
- Для реализации функций для панорамирования диаграммы влево и вправо
Также были бы полезны обходные пути для этих 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")
Три изменения, которые я внес, были:
-
Замените вызовы на
get.chob()
вызовами наquantmod:::get.chob()
. Это необходимо, потому что, в отличиеzooom
от ,zooom2
не имеетnamespace:quantmod
в качестве окружающей среды. -
Назначьте выходные
zoomChart()
данные объектуchob
. -
Вернитесь
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, поэтому я понятия не имел о функции дампа, очень полезной.