我正在尝试以add_TA
的格式编写一个简单函数,将一般段添加到绘图中。
该函数将接收N×4矩阵。矩阵中的每一行都是一段。
我尝试修改add_SMA
以满足我的需求,但没有运气。
add_Segments <- function (segs , ...)
{
lenv <- new.env()
lenv$add_segments <- function(segs , ...) {
segments(segs[,1] , segs[,2] , segs[,3] , segs[,4] , ...)
}
mapply(function(name, value) {
assign(name, value, envir = lenv)
}, names(list(segs = segs , ...)), list(segs = segs, ...))
plot_object <- current.chob()
lenv$xdata <- segs
plot_object$set_frame(2)
exp <- parse(text = "add_segments(segs = segs , ...)")
plot_object$add(exp, env = c(lenv, plot_object$Env), expr = TRUE)
plot_object
}
失败
Error in plot.window(c(1, 1658), c(NaN, NaN)) : need finite 'ylim' values
当我在xdata
中设置lenv
但我想我没有这样做时,我确实想到了这一点。
这是一个可重现的示例,用于说明结果并segments
正常工作。
require(quantmod)
s <- get(getSymbols('MSFT'))["2012"]
chart_Series(s)
segs <- matrix(c(183,31.61,213,30.20,221,26.34,233,26.26) , byrow = T , nrow = 2)
segments(segs[,1] , segs[,2] , segs[,3] , segs[,4] , col = 'red')
我使用add_TA
格式(而不仅仅是上面示例中的绘图)的原因是我想添加其他指标,我希望在绘图对象刷新后这些段保留在图形上。
答案 0 :(得分:1)
您可以使用add_Series
函数执行此操作,但您必须进行一些操作才能以正确的格式获取数据。下面的函数为你做了那些操作。
interp <- function(Data, Points) {
# merge points with original data to create NA
m <- merge(Data[Points], index(Data))
# linear approximation at equidistant spacing,
# rather than at index values (the default)
na.approx(m, seq(nrow(Data)))
}
chart_Series(s)
add_Series(interp(Hi(s), c(183,213)), type="line", on=1)
add_Series(interp(Lo(s), c(221,233)), type="line", on=1)