2013-08-06 1 views
1

일반 세그먼트를 플롯에 추가하는 add_TA 형식의 간단한 함수를 작성하려고합니다. 이 함수는 N x 4 매트릭스를받습니다. 행렬의 각 행은 세그먼트입니다.그래프를 quantmod에 추가하는 일반 함수

나는 내 필요에 행운을 빕니다 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 
} 

이것은 내가 lenvxdata을 설정할 때 그래도 난 내가 그 돌을 모금

Error in plot.window(c(1, 1658), c(NaN, NaN)) : need finite 'ylim' values 

실패하지만 난하지 않았다 같아요.

결과를 설명하고 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 형식을 사용하여 (바로 위의 예제와 같이 그리기되지 않음)하고있어 내가 추가 지표를 추가 할 내가 세그먼트가 플롯 객체 새로 고침 후 그래프에 있고 싶어한다는 것입니다.

답변

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) 
+0

감사합니다. @Joshua. 그레이트. 한가지는 - 나는'add_Series' 나'add_TA (.., type = 'l')'로는 작동하지 않을 것입니다. 라인이 플롯에서 그려지는 유일한 방법은'add_TA (x, type = 'p')'를 사용할 때입니다. 왜 그런지 알 겠어? – haki

+0

안녕하세요 @ 여호수아, 방금 2007 년에서 2013 년까지 매일의 시계열을 통해 43 줄의 기능을 테스트했습니다. 완료하려면 +30 초가 걸렸습니다. 나는 병합을 추측하고있다. 그리고 근사치는 많은 시간을 소비한다. 이 경우 불필요하기 때문에 기존 인터페이스를 사용할 수 있도록 사용하고 있습니다. 시리즈가 아닌 세그먼트를 사용하는 방법을 생각할 수 있습니까? – haki

+0

@ 하키 : "작동하지 못한다"는 것은 무엇을 의미합니까? 그것은 나를 위해 작동합니다. 필자는 필자의 답에서와 같이 함수를 호출 할 때마다 43 줄의 시간이 오래 걸리는 이유가 있기 때문에 모든 함수 호출 후에 줄거리가 다시 그려진다. 모든'add_Series' 호출을'chart_Series'의'TA ='인수에 넣으십시오. 예 : 'chart_Series (s, TA = "add_Series (...); add_Series (...); ...")'. –