2016-07-18 4 views
8

.Call은 다소 불충분하게 문서화 된 것처럼 보입니다..Call에 대한 PACKAGE 인수는 어떻게 작동합니까?

PACKAGE : ?.CallPACKAGE 인수에 대한 설명을 제공합니다 제공하는 경우,이 인수 (플러스 기존의 확장에 의해 주어진 DLL에 문자열 .NAME에 대한 검색을 제한 '하는 .so', '을 .DLL' , ...).

이 인수는 ... 다음에 나오며 그 이름을 축약 할 수 없습니다.

이 인수를 사용하여 다른 패키지가 외부 기호를 무시할 수 없도록하고 검색 속도를 높일 수있는 패키지 안전성을 추가하기위한 것입니다 ('참고'참조).

그리고

노트에 이러한 기능 중 하나가 PACKAGE를 지정 (하나의 DLL로 검색을 제한하는) 또는 기본 심볼의 하나로서 .NAME을 통과 할, 자주 사용할 경우

사물. 기호 검색은 특히 많은 네임 스페이스가로드 될 때 시간이 오래 걸릴 수 있습니다.

R에 링크 된 기호의 경우 PACKAGE = "base"이 표시 될 수 있습니다. 코드에서 사용하지 마십시오. 이러한 기호는 API의 일부가 아니며 경고없이 변경 될 수 있습니다.

PACKAGE = "" (이전에는 문서화되지 않았 음) : 이제 오류가 발생했습니다.

그러나 사용 예제가 없습니다.

PACKAGE 인수가 어떻게 작동하는지 불분명합니다. 예를 들어, this 질문에 대답에, 나는 다음은 일을해야 생각하지만 그렇지 않습니다 :

.Call(C_BinCount, x, breaks, TRUE, TRUE, PACKAGE = "graphics") 

대신이 작동합니다

.Call(graphics:::C_BinCount, x, breaks, TRUE, TRUE) 

이이 C_BinCount는 안 export 때문에 단순히인가? 즉 내부 코드 hist.defaultPACKAGE = "graphics"이 추가 되었다면 이것이 가능했을까요?

이것은 간단하지만이 인수의 사용법을 찾는 것은 거의 없습니다. 내가 찾은 소스의 아무도 ... 실제로 감사하겠습니다 작업이의 예를 언급 (1, 2, 3, 4, 5)을 통과하는 것보다 더주지

(그냥 기존 패키지에있는 코드를 인용 될지라도) (자기 봉쇄 목적을 위해, 당신은 여기에 다른 질문에서 코드 붙여 넣기 복사 할 x하고 breaks하지 않는 경우) :

x = runif(100000000, 2.5, 2.6) 
nB <- 99 
delt <- 3/nB 
fuzz <- 1e-7 * c(-delt, rep.int(delt, nB)) 
breaks <- seq(0, 3, by = delt) + fuzz 
+0

좋은 질문, 나는 단지 그것을 봤다, 아무도 경험이없는 경우를 대비해 몇 가지 힌트를 줄 수있는 것을 발견했다. http://www.biostat.jhsph.edu/~bcaffo/statcomp/files/dotCall.pdf – Learner

+1

@ 실제로 학습자는 내 질문의 링크 3입니다. – MichaelChirico

+1

[또한이 참고서] (https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Registering-native-routines)를 참조하십시오. –

답변

10

C_BinCount는 "NativeSymbolInfo"클래스의 목적은, 오히려보다 C 레벨 함수의 이름을 지정하는 문자열, 따라서 PACKAGE (" 문자 스트링 .NAME "검색)은 관련이 없습니다. C_BinCount은 그래픽 패키지 NAMESPACEuseDynLib()에 언급 된 기호로되어 있습니다.

R 기호로 C_BinCount의 해상도는 다른 기호와 동일한 규칙을 따릅니다. NAMESPACE에서 내 보낸 것이 아니므로 graphics:::C_BinCount을 통해서만 액세스 할 수 있습니다. 또한 이러한 이유로 인해 강력한 코드 개발을위한 제한이 없습니다. C 진입 점이 심볼로 가져 오기되었으므로 이 아니며이 문자열로 사용 가능하지 않으므로 .Call("C_BinCount", ...)은 작동하지 않습니다.

NativeSymbolInfo 객체를 사용하면 R에 C 코드의 위치를 ​​알려주므로 PACKAGE를 통해 다시 할 필요가 없습니다. 문자열보다는 기호를 사용하는 선택은 패키지 개발자가 만들고, 일반적으로 좋은 습관으로 간주됩니다. NativeSymbolInfo가 발명되기 전에 개발 된 많은 패키지는 PACKAGE 인수를 사용합니다. Bioconductor 소스 트리를 grep하면 .Call. * PACKAGE가있는 4379 줄이 있습니다 (예 : here).

예제를 포함한 추가 정보는 R 확장 작성 섹션 1.5.4에 나와 있습니다.

+0

abstruse 문서에 대해 말하기 ...''.Call ("C_BinCount", x, breaks, TRUE, TRUE, PACKAGE = "graphics")'을 시도했고 다른 오류가 발생했습니다 (''C_BinCount "'.()''graphics ''') ... 이것은 export되지 않았기 때문입니까? 호출을 실행하기 위해 여기'PACKAGE' 인수를 사용할 방법이 없습니까? – MichaelChirico

+0

또한'PACKAGE' 인수를 사용하는 _actual_ R 코드를 알고 있습니까? 이 "야생에서"의 예를 찾는 것이 유용 할 것입니다. – MichaelChirico

+0

패키지 작성자가 문자열을 통해 기호를 노출하지 않기로 선택했기 때문에 입력 한 금액이 없기 때문에 "C_BinCount"가 작동합니다. 야생에는 많은 예가 있습니다. 나는 하나에 연결했다. –