我正在尝试构建一个包,其中使用了来自“numDeriv”包的函数“hessian”。然而,当我构建包并运行代码时,会出现以下错误:
无法将对象转换为环境:[类型=字符; 目标=ENVSXP]。
以下是简化后的Rcpp示例代码。
我的R版本是3.5.1,RStudio版本是1.1.456,Rcpp版本是0.12.19,RcppArmadillo版本是0.9.100.5.0,numDeriv版本是2016.8.1。我的操作系统是Windows 10。
我成功地从R包“stats”中导入了“optimize”,使用了类似的方法。以下是简化的示例代码。
无法将对象转换为环境:[类型=字符; 目标=ENVSXP]。
以下是简化后的Rcpp示例代码。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
#include <stdio.h>
#include<armadillo>
using namespace Rcpp;
using namespace std;
double testfunc(double X){
return pow(X+1,2);
}
double hessian_rcpp(double X){
Rcpp::Environment numDeriv("package:numDeriv");
Rcpp::Function hessian = numDeriv["hessian"];
Rcpp::List hessian_results = hessian(
Rcpp::_["func"] = Rcpp::InternalFunction(testfunc),
Rcpp::_["x"] = X);
arma::vec out = Rcpp::as<arma::vec>(hessian_results[0]);
return out[0];
}
// [[Rcpp::export]]
double returnhess(double X){
double out = hessian_rcpp(X);
return out;
}
在构建软件包后,运行以下 R 代码会导致错误。
library(test)
returnhess(X=3)
Error in returnhess(X = 3) :
Cannot convert object to an environment: [type=character; target=ENVSXP].
我的命名空间是
useDynLib(test, .registration=TRUE)
importFrom(Rcpp, evalCpp)
exportPattern("^[[:alpha:]]+")
我的描述是
Package: test
Type: Package
Title: What the Package Does (Title Case)
Version: 0.1.0
Author: Who wrote it
Maintainer: The package maintainer <yourself@somewhere.net>
Description: More about what it does (maybe more than one line) Use four spaces when indenting paragraphs within the Description.
License: What license is it under?
Imports: Rcpp, RcppArmadillo, numDeriv
LinkingTo: Rcpp, RcppArmadillo, numDeriv
Encoding: UTF-8
LazyData: true
我的R版本是3.5.1,RStudio版本是1.1.456,Rcpp版本是0.12.19,RcppArmadillo版本是0.9.100.5.0,numDeriv版本是2016.8.1。我的操作系统是Windows 10。
我成功地从R包“stats”中导入了“optimize”,使用了类似的方法。以下是简化的示例代码。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
#include <stdio.h>
#include<armadillo>
using namespace Rcpp;
using namespace std;
double testfunc(double X){
return pow(X+1,2);
}
double optim_rcpp(){
Rcpp::Environment stats("package:stats");
Rcpp::Function optimize = stats["optimize"];
Rcpp::List opt_results = optimize(
Rcpp::_["f"] = Rcpp::InternalFunction(testfunc),
Rcpp::_["lower"] = -10,
Rcpp::_["upper"] = 10);
arma::vec out = Rcpp::as<arma::vec>(opt_results[0]);
return out[0];
}
// [[Rcpp::export]]
double returnoptim(){
double out = optim_rcpp();
return out;
}
与上述相同的NAMESPACE和DESCRIPTION
然后运行以下R代码就可以了
returnoptim()
[1] -1