मैं एक पैकेज बनाने की कोशिश कर रहा हूं जो पैकेज 'numDeriv' से 'हेसियन' फ़ंक्शन का उपयोग करता है। हालांकि, जब मैं पैकेज बनाता हूं और कोड चलाता हूं तो मुझे त्रुटि मिलती है

वस्तु को एक वातावरण में परिवर्तित नहीं कर सकता: [प्रकार = चरित्र; लक्ष्य = ईएनवीएसएक्सपी]।

उदाहरण सरलीकृत आरसीपीपी कोड नीचे

#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 है। मेरा ऑपरेटिंग सिस्टम विंडोज़ 10 है।

मैं एक समान दृष्टिकोण के साथ आर पैकेज 'आँकड़ों' से 'ऑप्टिमाइज़' को सफलतापूर्वक आयात करने में सक्षम था। उदाहरण सरलीकृत कोड नीचे

#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

फिर निम्नलिखित आर कोड चलाना काम करता है

returnoptim()
[1] -1
2
mike 9 नवम्बर 2018, 20:43

1 उत्तर

सबसे बढ़िया उत्तर

वर्कअराउंड के रूप में आप जोड़ सकते हैं

 Depends:numDeriv

आपके DESCRIPTION को। यह सुनिश्चित करता है कि numDeriv पैकेज आपके पैकेज के साथ लोड किया गया है।

बीटीडब्ल्यू: मैं एक पैकेज में using namespace Rcpp; का उपयोग करने से बचना चाहूंगा। और मैं कभी भी using namespace std; का उपयोग नहीं करूंगा। मैं #include <stdio.h> का उपयोग करने का एक अच्छा कारण नहीं सोच सकता और #include<armadillo> जब RcppArmadillo का उपयोग किया जाता है तो यह अनावश्यक है।

3
Ralf Stubner 9 नवम्बर 2018, 21:36