2009-07-24 2 views
2

C로 작성된 루틴을 호출하는 CRAN에 제출하려는 R 패키지를 만들고 있습니다. 어떻게 컴파일 된 C 루틴을로드합니까? 플랫폼 독립적 인 방식으로 R 함수에서? 내 설치를 위해 공유 라이브러리의 전체 경로를 지정하는 방법을 알아낼 수있는 dyn.load하는R 패키지에서 C 함수를 호출하기위한 dyn.load의 휴대용 사용

function(mydata) 
{ 
dyn.load(file.path(.Library,"mypkg/libs/i386",paste("mypkg", .Platform$dynlib.ext, sep=""))) 
try(
    output <- .C("myfunc_cversion", 
       in_data = as.double(mydata), 
       res_data = as.double(res), 
       PACKAGE = "mypkg") 
    ) 
    result <- as.matrix(output$res_data) 
    return(result) 
} 

문제는 호출입니다 : 나는 내 인텔 기반 Mac에서 내 패키지 작업을 할 수 있어요 패키지를 휴대용 방식으로 제공합니다.

내가 사용해야하는 .Library 외에도 R에 다른 변수가 있습니까? 아니면이 경우 dyn.load보다 우수한 기능이 있습니까?

답변

0

library.dynam()의 매뉴얼 페이지가 필요합니다. 그것은 당신이 원하는 것을 할 수 있어야합니다. mysharedobject가 끝 된 .dll/.so를 등없이 공유 오브젝트 파일의 이름입니다

function(mydata) 
{ 
library.dynam("mysharedobject",package=c("mypkg")) 
try(
     output <- .C("myfunc_cversion", 
        in_data = as.double(mydata), 
        res_data = as.double(res), 
        PACKAGE = "mypkg") 
     ) 
     result <- as.matrix(output$res_data) 
     return(result) 
} 

.

설명서 페이지는 .onLoad() 또는 .First.lib() 기능에서만 사용하는 것이 좋습니다.

HTH는


http://sekhon.berkeley.edu/base/html/library.dynam.html

2

난 당신이 너무 복잡하고 있습니다 생각합니다. CRAN에있는 기존 1800+ 패키지 중 일부를 언제든지 참조 할 수 있습니다. 일반적으로 대부분의 패키지는 .onLoad를 통해 시작할 때 오브젝트 코드를로드합니다 (NAMESPACE 파일을 통해 자동화 될 수도 있습니다). R 확장 기능 설명서를 참조하십시오.

하는 것은 간단한 예를 들어, 당신이 내 digest 패키지를 볼 수 있었다, 그것은 파일 R 패키지 난 후에

.onLoad <- function(lib, pkg) { 
    library.dynam("digest", pkg, lib) 
} 

(표준 접근 방식이 매뉴얼에 제안)/zzz.R에서 다음을 사용 동적 라이브러리의 모든 함수로드는 호출을위한 모든 R 함수에서 사용할 수 있습니다. 그것은 각 함수에 library.dynam()를 추가하는 것보다 더 일반적입니다 (그리고 맨 위에는 R 세션마다 한 번만 library.dynam()가 필요합니다).

R 자체는 확장명 (.dll, .so, .dylib, ...) 및 기타 모든 플랫폼 별 핵심 정보를 처리합니다. 나는 그 접근법을 돌릴 이유가 없다. 따라서 매뉴얼과이 작업을 수행하는 (말 그대로) 수백 개의 패키지를보십시오.


2

나는 "나는 패키지에 이름 공간을 사용하는 경우 다음 나는 또한 매뉴얼의 섹션 1.6.3에 설명 된대로 (패키지의 네임 스페이스 파일 내부의 useDynLib 지시어를 사용하여이 문제를 해결할 수 있다는 것을 발견 Writing R Extensions "버전은 2.9.1 (www.r-project.org)입니다.C 함수 이름 주위와 PACKAGE 인수없이 따옴표와 함께입니다

myfunc <- function(mydata) 
{ 
try(
    output <- .C(myfunc_cversion, 
       in_data = as.double(mydata), 
       res_data = as.double(res)) 
    ) 
    result <- as.matrix(output$res_data) 
    return(result) 
} 

: 다음에 R 기능 정의를 수정

useDynLib(mypkg, myfunc_cversion) 
export(myfunc) 

: 같은

내 이름 공간 파일은 이제 보인다 .C 전화.

관련 문제