2014-10-20 4 views
0

충돌하는 패키지가 내 패키지가 아닌 경우 마스킹을 처리하는 가장 좋은 방법이 올바른 방법으로 충돌하는지 궁금합니다. 다음 예제를 고려하십시오. 나는 시계열 과 함께 일을 많이하며 일반적으로 quarter, year 등과 같은 함수 이름이 꽤 자주 사용됩니다. 따라서 과 data.table을로드하면 R의 기능은 패키지가로드되는 순서에 따라 분명히 다릅니다.R 패키지의 마스킹 충돌을 올바르게 처리하는 방법은 무엇입니까?

library(tis) 
library(data.table) 
# this masks: between, month, quarter, year 
library(TSfame) # loads TSdbi 
con <- TSconnect("somefame.db") 
# the following fails when data.table was loaded after tis 
ts1 <- TSget("somekeyInYourDB",con) 

TSdbi 패키지의 TSget이 더 이상 작동하지 않습니다. 패키지를 포크하고 :: 구문을 구현해야합니까? 예는 구체적 일지 모르지만 질문은 꽤 일반적입니다. 경험 많은 사용자는 무엇을 할 것입니까?

편집 : 아마도 이것을 더 명확하게 명시해야합니다. 문제는 TSget이 명시 적으로 호출되어야하는 함수를 호출하기 때문에 함수를 명시 적으로 호출 할 기회가 없으며 오직 tis 만 있다고 가정합니다.

EDIT2는 리치면의 요청에 따라 호출 스택을 첨가하는 것은 :

Tracing year(actualStart) on entry 
[[1]] 
TSget("kofbauindikator_total", con) 

[[2]] 
    TSget("kofbauindikator_total", con) 

[[3]] 
.local(serIDs, con, ...) 

[[4]] 
    getfame(serIDs[i], dbname[i], save = FALSE, envir = parent.frame(), 
    start = NULL, end = NULL, getDoc = FALSE) 

    [[5]] 
    year(actualStart) 

    [[6]] 
    .doTrace((function() 
    print(sys.calls()))(), "on entry") 

[[7]] 
eval.parent(exprObj) 

[[8]] 
eval(expr, p) 

[[9]] 
eval(expr, envir, enclos) 

[[10]] 
(function() 
    print(sys.calls()))() 

Error in as.POSIXlt.default(x) : 
    do not know how to convert 'x' to class “POSIXlt” 
+1

'TSget'은 충돌 함수 중 'quarter'를 호출하지 않으므로 여기에 뭔가 빠졌습니다. 문제는 (1)'TSfame'의 함수가'tis'에서 함수를 호출하지만'data.table'에서 함수를 호출하려고하거나 (2)'TSfame'의 함수가 때때로 함수를 'tis'에 쓰고 때로는'data.table'에서'search()'경로에 따라 함수를 호출할까요? –

+0

문제는 'TSget'이 '분기'또는 충돌하는 함수 중 하나를 호출한다는 것입니다. data.table을로드하지 않으면 모든 것이 작동합니다. data.table을 호출하면 tis 함수 대신 4 개의 마스크 함수 중 하나가 호출됩니다. 그래서 2) 실제로 내 문제입니다. –

+1

'TSfame'은 TSdbi를 가져 오는 것이 아니라 가져 오는 것이 좋다고 생각합니다 (http://stackoverflow.com/q/8637993/134830 참조). 문제를 쉽게 확인하도록하십시오. –

답변

1

호출 스택은 모호라는 함수 yeargetfame 의해 호출되는 것을 나타낸다. getAnywhere("getfame")은 이것이 fame 패키지에 있음을 나타냅니다.

packageDescription("fame")fame이 가져 오는 것이 아니라 tis인데 문제가있는 곳입니다. 권고 된 바와 같이 here, 패키지 관리자 (Jeff Hallman)에게 수입에 대한 종속성을 변경하도록 요청하는 이메일을 보내는 것이 좋습니다. 즉 패키지 재 작업의 비트를 요구할 수있다, 그래서 당신이 필요 같은

startYear <- as.integer(tis::year(actualStart)) 

(있을 수있는 다른 변화에 라인을 getfame에서

startYear <- as.integer(year(actualStart)) 

을 변경하는 단기 수정을 제안 할 수 있습니다.)

관리자가 수정을 기다리는 동안 assignInNamespace을 사용하여 기능을 무시할 수 있습니다. 즉, 패키지를로드하기 전에 다음을 입력하십시오.

assignInNamespace(
    "getfame", 
    function(sernames, db, connection = NULL, save = FALSE, envir = parent.frame(), 
    start = NULL, end = NULL, getDoc = TRUE) 
    { 
    # your fixed function definition with tis::year 
    }, 
    "fame" 
) 
+0

+1 정말 고마워. 나는 과거에 그에게 당신의 빠른 수정과 비슷한 것을 제안했다고 생각한다. 제가 할 수있는 일이 있습니까?하지만 이것이 틈새 제품이기 때문에 관리자를 기다리는 것입니까? 'assignInNamespace'에 대해 좀 더 자세히 설명해 주시겠습니까? 하지만 원래의 질문으로 돌아가서 : 그것은 의미합니까? 패키지 관리자가 여기서 기다릴 수있는 방법을 기다리고 있습니까? –

+0

'assignInNamespace'를 사용하여 자신을 위해서만'getfame'을 오버라이드하거나, 패키지를 포크하고 모든 것을 복사하거나 (다른 사람들이 사용할 수 있도록 공개적으로 포크를 호스팅 할 수도 있음) 기존의 관리자를 설득하여 자신을 고칠 수 있습니다 꾸러미. –

+0

마침내이 패치로 돌아와서 아이디어로 작업하게 만들었습니다. 나머지 문제는 명성에서 내 보내지 않은 몇 가지 기능을 찾아내는 것이 었습니다. 그래서 저는 명성을 얻었습니다 ::: functionname 모든 이들 .. 그러나 https://gist.github.com/mbannert/6584c3aa765648b987c3 작품은 –