2013-10-07 2 views
2

함수 내부에 네임 스페이스 변수를 할당하는 데 어려움을 겪고 있습니다. CRAN 패키지 "qcc"를 사용하는이 예제를 고려하십시오 : qcc()은 플롯을 생성하지만 플롯의 표시 옵션은 qcc.options()으로 제어됩니다.함수 내부에 네임 스페이스 변수 지정

세계에서 작업 할 때, 모든 것이 괜찮 :

library(qcc) 
qcc.options(bg.margin="red")  # sets margin background colour, i.e. 
            # qcc:::.qcc.options$bg.margin is "red" 
qcc(rnorm(100), type = "xbar.one") # generates a plot with red margin 

그러나 함수의 로컬 환경에서 작업 할 때, qccqcc.options 다르게 네임 스페이스를 사용하는 것 :

foo <- function(x){ 
    qcc.options(bg.margin=x) 
    qcc(rnorm(100), type = "xbar.one") 
} 

foo("green") # generates a default plot with grey margins 

답변

3

이것은이다 그 이유는 qcc.options.qcc.options 변수가 저장되어 있기 때문입니다. 전역에서 작업하는 경우는 qcc:::.qcc.options이지만, 함수 안에있을 때는 .qcc.options이라는 로컬 변수에 저장하므로 plot.qcc (qcc이 호출 됨)을 사용하려고하면 전역 변수 내 보낸) .qcc.options이 아닌 qcc:::.qcc.options입니다. 당신이 결과를 보면, 당신은 qcc.options 로컬 변수를 생성하고 "green" 그러나이 ISN에 bg.margin의 값을 변경하는 것을 볼 수 있습니다

bar <- function(x){ 
    pre <- qcc:::.qcc.options 
    pre.marg <- qcc.options("bg.margin") 
    qcc.options(bg.margin=x) 
    post1 <- qcc:::.qcc.options 
    post2 <- .qcc.options 
    post.marg <- qcc.options("bg.margin") 
    qcc(rnorm(100), type = "xbar.one") 
    list(pre,post1,post2,pre.marg,post.marg) 
} 
bar('green') 

: 여기

무엇을 옵션으로 일어나고 보여주는 기능입니다 나중에 plot.qcc에 의해 참조되는 개체가 없습니다.

아마도 이것이 최고의 설정이 아니기 때문에 패키지 관리자에게 몇 가지 코드 수정을 요청해야하는 것처럼 보입니다.

편집 : 해결 방법은 assignInNamespace을 사용하여 로컬 변수를 사용하여 전역 변수를 덮어 쓰는 것입니다. (물론,이 후 전 세계적으로 매개 변수를 변경하고 매개 변수를 업데이트하지 않는 한 이후의 모든 플롯에 영향을 미칠 것입니다.)

foo <- function(x){ 
    qcc.options(bg.margin=x) 
    assignInNamespace('.qcc.options',.qcc.options,ns='qcc') 
    qcc(rnorm(100), type = "xbar.one") 
} 
foo('green') 

여기 enter image description here

+0

Thomas 대단히 감사합니다! 무슨 일이 일어 났는지 알았고 변수를 올바르게 할당하는 방법을 몰랐습니다. 'assignInNamespace'는 작업을 잘합니다. – albifrons

+0

@ user2853399 좋은 소리입니다. 당신이 그 단계를 밟아서는 안되기 때문에 패키지 관리자에게 확실히 말할 것입니다. (왜냐하면'qcc.options'가 실제로하는 일이 명백하지 않기 때문입니다). – Thomas

+0

답변을 얻은 직후이 페이지에 대한 링크가있는 관리자에게 이메일을 보냈습니다. 다시 한번 감사드립니다! – albifrons

4

이 못생긴 해킹 : 물론

foo <- function(x){ 
    old.qcc.options <- get(".qcc.options", asNamespace("qcc")) 
    assign(".qcc.options", qcc.options(bg.margin=x), asNamespace("qcc")) 
    res <- qcc(rnorm(100), type = "xbar.one") 
    assign(".qcc.options", old.qcc.options, asNamespace("qcc")) 
    invisible(res) 
} 

foo("green") 

, 범위 지정 문제는 qcc.options을 변경하면 더 쉽게 해결할 수 있습니다. 패키지 관리자에게 연락해야합니다.

+0

대단히 감사합니다, 롤랜드! 이것은 기본적으로 토마스에 의해 제안 된 것과 유사한 해결 방법으로 사용법 (좋은 점) 후에 원래 옵션을 다시 설정하는 것입니다. 이미 포장업자에게 우송했습니다. 다시 한 번 감사드립니다. 해킹은 저에게 완벽합니다. – albifrons

관련 문제