2016-04-28 49 views
0

我有一個定義本地環境的包選項。當我嘗試從RCPP做同樣的事情如何訪問Rcpp中的包中本地定義的環境?

options <- new.env() 
options$foo <- "bar" 

foobar <- function() { 
    flag = options$foo == "bar" 
    flag 
} 

:只有

bool foobar() { 
    bool flag = false; 
    Environment env("package:myPackage"); 
    SEXP o = env.get("options"); 
    Environment options(o); 
    if (options.exists("foo")) { 
     std::string bar = as<std::string>(options["foo"]); 
     flag = (bar == "bar"); 
    } 
    return flag; 
} 

在書面中的R相同的封裝功能,可以訪問此環境沒有需要導出如果我將導出(選項)添加到NAMESPACE,則適用。所以我自己解決了這個問題,但很想知道這種明顯的不對稱性。出口要求是預期的,或者如果我的Rcpp函數的實現是責任?

+1

附件包環境只包含導出的符號,所以試圖以默認方式查找'options'不會解決它。你需要從包的命名空間中獲取'options',而不是尋找你的包附加的環境。 –

回答

3

您想從包的名稱空間中提取符號,而不是附加的包環境。

例如,這兩種方法比較解決utils:::argNames,這是utils命名空間內未導出功能:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
SEXP ns_symbol(const std::string& pkg, const std::string& symbol) { 
    Environment env = Environment::namespace_env(pkg); 
    return env[symbol]; 
} 

// [[Rcpp::export]] 
SEXP pkg_symbol(const std::string& pkg, const std::string& symbol) { 
    Environment env("package:" + pkg); 
    return env[symbol]; 
} 


/*** R 
library(utils) 
ns_symbol("utils", "argNames") 
pkg_symbol("utils", "argNames") 
*/ 

Rcpp::sourceCpp()運行這給了我:

> Rcpp::sourceCpp('lookup.cpp') 

> library(utils) 

> ns_symbol("utils", "argNames") 
function (fname, use.arg.db = .CompletionEnv$settings[["argdb"]]) 
{ 
    if (use.arg.db) 
     args <- .FunArgEnv[[fname]] 
    if (!is.null(args)) 
     return(args) 
    args <- do.call(argsAnywhere, list(fname)) 
    if (is.null(args)) 
     character() 
    else if (is.list(args)) 
     unlist(lapply(args, function(f) names(formals(f)))) 
    else names(formals(args)) 
} 
<bytecode: 0x7ff40889e6d0> 
<environment: namespace:utils> 

> pkg_symbol("utils", "argNames") 
NULL 

正如你所看到的,符號在包的名稱空間內解析,但不在附加的環境中解析。

相關問題