Mercurial > pub > dyncall > bindings
diff R/rdyncall/R/dynport.R @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/R/rdyncall/R/dynport.R Thu Mar 19 22:26:28 2015 +0100 @@ -0,0 +1,36 @@ +# Project: rdyncall +# File: R/dynports.R +# Description: repository for multi-platform bindings to binary components. +# Author: Daniel Adler <dadler@uni-goettingen.de> + +dynport <- function(portname, portfile=NULL, repo=system.file("dynports", package="rdyncall")) +{ + # literate portname string + portname <- as.character(substitute(portname)) + if (missing(portfile)) + { + # search for portfile + portfile <- file.path( repo, paste(portname,".R",sep="") ) + if ( !file.exists(portfile) ) portfile <- file.path( repo, paste(portname,".json",sep="") ) + if ( !file.exists(portfile) ) stop("dynport '", portname, "' not found.") + } + loadDynportNamespace(portname, portfile) +} + +loadDynportNamespace <- function(name, portfile, do.attach=TRUE) +{ + name <- as.character(name) + portfile <- as.character(portfile) + if (do.attach) { + envname <- paste("dynport", name, sep=":") + if ( envname %in% search() ) return() + env <- new.env() + sys.source(portfile, envir=env) + attach(env, name=envname) + } else { + env <- new.env() + sys.source(portfile, envir=env) + return(env) + } +} +