大佬教程收集整理的这篇文章主要介绍了c – ‘unlockEnvironment’通过’Rcpp’而不是’inline’实现,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有人可以让我开始我需要做什么来实现Rcpp下面的unlockEnvironment代码?
背景
遇到了这个post并尝试了基于C代码的Winston Chang的解决方案inline.它有效,但我觉得我知道太少(实际上没什么,就是)内联或C/C++真的知道我在做什么;-)
所以我认为这将是一个很好的机会,最终开始学习如何使用R作为C和C的接口.而且我想我会跳上Rcpp列车这样做!
require("inline") inc <- ' /* This is taken from envir.c in the R 2.15.1 source https://github.com/SurajGupta/r-source/blob/master/src/main/envir.c */ #define FRAME_LOCK_MASK (1<<14) #define FRAME_IS_LOCKED(E) (ENVFLAGS(E) & FRAME_LOCK_MASK) #define UNLOCK_FRAME(E) SET_ENVFLAGS(e,ENVFLAGS(E) & (~ FRAME_LOCK_MASK)) ' src <- ' if (TYPEOF(env) == NILSXp) error("use of NULL environment is defunct"); if (TYPEOF(env) != ENVSXp) error("not an environment"); UNLOCK_FRAME(env); // Return TRUE if unlocked; falSE otherwise SEXP result = PROTECT( Rf_allocVector(LGLSXP,1) ); LOGICAL(result)[0] = FRAME_IS_LOCKED(env) == 0; UNPROTECT(1); return result; ' unlockEnvironment <- inline::cfunction( signature(env = "environment"),includes = inc,body = src )
重构错误
旁注:当我以某种方式在我的包项目的/ R目录中组织它时,我遇到了Winston代码的错误:
在大多数情况下使用S4方法,我试图将Winston的代码分解为我放入文件/R / .unlockEnvironment.r的标准R函数.unlockEnvironment().
然后,我将在/R/unlockEnvironment.r中为unlockEnvironment()创建我的S4方法.具有签名env:environment的方法然后将简单地调用.unlockEnvironment(env = env).
设置这样的东西,我最终得到以下错误:
如果我将/R/.unlockEnvironment.r目录中的代码放在/R/unlockEnvironment.r中的相应方法中(因此每次调用unlockEnvironment()的相应方法时重新获取内联代码),一切正常很好 – 但由于反复重新采购,效率非常低.
主要思路:编写一些C代码,将其放入.cpp文件,然后调用Rcpp :: sourceCpp(< file>)加载它.对于这个特例:
#include <Rcpp.h> using namespace Rcpp; /* This is taken from envir.c in the R 2.15.1 source https://github.com/SurajGupta/r-source/blob/master/src/main/envir.c */ #define FRAME_LOCK_MASK (1<<14) #define FRAME_IS_LOCKED(E) (ENVFLAGS(E) & FRAME_LOCK_MASK) #define UNLOCK_FRAME(E) SET_ENVFLAGS(e,ENVFLAGS(E) & (~ FRAME_LOCK_MASK)) // [[Rcpp::export]] bool unlock_environment(Environment env) { UNLOCK_FRAME(env); return FRAME_IS_LOCKED(env) == 0; } /*** R env <- new.env() lockEnvironment(env) try(env$a <- 1) ## error unlock_environment(env) env$a <- 1 */
在包含这些内容的文件上调用Rcpp :: sourceCpp()会给我:
> Rcpp::sourceCpp('~/scratch/unlock.cpp') > env <- new.env() > lockEnvironment(env) > try(env$a <- 1) ## error Error in env$a <- 1 : cAnnot add bindings to a locked environment > unlock_environment(env) [1] TRUE > env$a <- 1 ## success!
这里的主要小功能:
>您可以使用base / STL C类型或Rcpp类型提供签名.请注意,bool是C bool类型,而Environment是包含环境的Rcpp类型.
> Rcpp Attributes处理这些C返回类型到R的SEXP的自动转换.
您可能也喜欢Hadley的adv-r
介绍.
以上是大佬教程为你收集整理的c – ‘unlockEnvironment’通过’Rcpp’而不是’inline’实现全部内容,希望文章能够帮你解决c – ‘unlockEnvironment’通过’Rcpp’而不是’inline’实现所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。