【发布时间】:2021-07-31 20:12:32
【问题描述】:
我想在函数 h_evap 中运行一个 Rcpp 函数 esat。两者都在一个通用的 .cpp 文件中,我在 Rstudio 中使用 sourceCPP 执行它。这是代码。 esat 和 h_evap 都被创建并且 esat 工作正常。但是 h_evap 给了我输出
> esat(42)
[1] 256.7082
> h_evap(42)
Error in h_evap(42) :
Not compatible with requested type: [type=closure; target=double].
我怀疑问题在于我如何尝试从全局环境访问 esat,但不知道如何调用 esat 来获取输出值而不是闭包。
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector esat(NumericVector Tk) {
NumericVector esat_out(Tk.size(), NAN);
for (size_t i=0; i<Tk.size(); i++) {
esat_out[i] = 6.1121 * Tk[i];
}
return esat_out;
}
// [[Rcpp::export]]
NumericVector h_evap(NumericVector Tk) {
Environment env = Environment::global_env();
NumericVector f_esat = env["esat"];
NumericVector h_evap_out(Tk.size(), NAN);
for (size_t i=0; i<Tk.size(); i++) {
h_evap_out[i] = (313.15 - Tk[i]);
h_evap_out[i] = h_evap_out[i] + f_esat(Tk[i]);
}
return h_evap_out;
}
/*** R
h_evap(42)
*/
另一种方法是使用 cppFunction。我已经尝试过了,但仍然得到这个 Rcpp 新手不清楚的错误。这是代码
library(Rcpp)
cppFunction('NumericVector esat(NumericVector Tk) {
NumericVector esat_out(Tk.size(), NAN);
for (size_t i=0; i<Tk.size(); i++) {
esat_out[i] = 6.1121 * Tk[i];
}
return esat_out;
}')
cppFunction('NumericVector h_evap(NumericVector Tk) {
NumericVector h_evap_out(Tk.size(), NAN);
for (size_t i=0; i<Tk.size(); i++) {
h_evap_out[i] = esat(Tk[i]);
}
return h_evap_out;
}')
esat 编译得很好。 h_evap 返回一个错误信息我不清楚...
【问题讨论】:
-
该行不应该是
Function f_esat = env["esat"]; -
有不同的工具用于不同的目的。
cppFunction()有其用途,sourceCpp()也有其用途。但最终你想要一个包裹。而且它真的并不难。 -
您之前可能遇到过
R CMD build和R CMD INSTALL,或者如果您没有遇到过它们在RStudio 中的等效按钮,或者devtools成语,或者这些天人们为避免使用的其他任何东西记录的用法:) 开玩笑,我通常只是用包名(没有额外的参数)调用Rcpp.package.skeleton(),复制源文件并从那里获取。在手动构建中,您需要compileAttributes(),如果您使用 RStudio,它会为您完成。我们在许多教程和研讨会中记录了这一点,也许一些现有的幻灯片可以提供帮助。 -
当然,您可以选择将自己描绘成您喜欢的任何角落。但是我们的许多 Rcpp 教程也展示了如何在 RStudio 中使用 Rcpp 构建包。我将这些作为免费服务提供,如果它们不适合您,则有退款保证,您可以尝试其他方法。世界很大。
-
您遇到的另一个问题是
esat(NumericVector Tk)需要一个向量,但您尝试使用标量调用:... + f_esat(Tk[i]);这行不通。我经常发现在尝试跑步或冲刺之前步行会有所帮助。尝试循序渐进地做事。