2010-06-22 2 views
29

패키지 네임 스페이스에서 함수를 푸시하여 해당 패키지의 내부 객체에 액세스 할 수 있도록하고 싶습니다 (예를 들어 stats 패키지 사용). 나는 사용 해봤습니다패키지 네임 스페이스에 객체 추가

myfun <- function(x) print(x) 
env = loadNamespace("stats") 
assign("myfun", myfun , env) 

그러나 잠겨 있습니다. 그래서 myfun 아직 존재하지 않기 때문에, 나는 그것을 잠금을 해제 할 수

unlockBinding("myfun", env) 

내 개체를 해제하려고했습니다.

어떤 도움이 필요합니까?

답변

28
@ 해들리의 솔루션의 라인을 따라

있지만 대해 어떻게 네임 스페이스의 환경에 사용 : 잠겨 일단 제외하고 (만약 내가 제대로 이해하고

environment(myfun) <- asNamespace('stats') 
+0

대단히 감사합니다. – TMS

7

트리플 콜론 연산자 :::을 사용하여 패키지의 내부 개체에 액세스 할 수 있습니다. 예를 들어, as.romanutils:::.roman2numeric을보십시오. (이것을 utils::.roman2numeric과 비교하십시오.) 네임 스페이스 안에 함수를 넣지 않아도됩니다.

패키지에서 dont.lockBindings을 보길 원할 것입니다. 그러면 잠긴 네임 스페이스가 중지됩니다.

+0

, 나는 패키지의 네임 스페이스의 잠금을 해제 할 수없는 경우를 dont.lockBindings로 다시로드). 따라서 새로운 함수를 사후에 추가하는 것은 불가능합니다. –

+0

@Etiennebr : AFAIK 당신이 맞습니다. 네임 스페이스가 잠기면 추가 할 수 없습니다. 나는 아직도'::: '이 진행될 수 있다고 생각한다. –

14

새 기능의 환경을 적절한 장소로 설정하는 것이 가장 좋은 이유는 무엇입니까?

myfun <- function(x) print(x) 
environment(myfun) <- as.environment("package:stats") 
+0

나는 그것을 몰랐다! 하지만 나는 그것이 네임 스페이스가 되길 바란다 : package 대신 stats : stats. 그것을 할 수있는 방법이 있습니까 (as.environment()에서 변경하는 것만으로는 작동하지 않습니다). –

+1

네임 스페이스는 환경이 아닙니다 ... – hadley

+7

저는 파티에 늦었지만 다른 사람들에게 유용 할 수 있습니다. 네임 스페이스는 실제로 환경입니다. 'namespace : stats'는 전역 환경의 _descendent_이며 모든 객체를 포함합니다. 내 보낸 객체는 전역 환경의 _ancestor_ 인'package : stats'로 복사됩니다. – wch