On Wed, Dec 29, 2010 at 12:51 PM, Romain Francois
<romain at r-enthusiasts.com> wrote:
Le 25/12/10 02:10, Gabor Grothendieck a ?crit :
How do I fix this so it works? ?The code is intended to return TRUE or
FALSE according to whether the variable with name nm in environment
env is a promise or not. ?In the example code below it returns FALSE
but I would like it to return TRUE. ?Is the promise being forced
somewhere along the way? ?Some other problem?
library(Rcpp)
f<- cxxfunction(signature(env="environment", nm = "character"),
? ? ? ? body=' Environment e(env);
? ? ? ? ? ?std::string s = as<std::string>(nm);
? ? ? ? ? ?return wrap(TYPEOF (e[s]) == PROMSXP); ',
? ? ? ? plugin="Rcpp")
# create promise
delayedAssign("prom", 3)
# want it to return TRUE but it returns FALSE
f(.GlobalEnv, "prom")
Hello,
Sorry for jumping late in this thread, xmas oblige.
Environment::operator[] eventually calls Environment::get() which is
implemented (in Environment.cpp) as follows:
? ?SEXP Environment::get( const std::string& name) const {
? ? ? ?SEXP res = Rf_findVarInFrame( m_sexp, Rf_install(name.c_str()) ?) ;
? ? ? ?if( res == R_UnboundValue ) return R_NilValue ;
? ? ? ?/* We need to evaluate if it is a promise */
? ? ? ?if( TYPEOF(res) == PROMSXP){
? ? ? ? ? ? ? ?res = Rf_eval( res, m_sexp ) ;
? ? ? ?}
? ? ? ?return res ;
? ?}
So the promise is explicitely forced.
We could augment the interface of Environment so that it adds something that
would not force the promise. Perhaps adding ', bool force = false' to get
and find.
We could also add a ctor to Rcpp::Promise that would grab a promise from an
environment, something like:
Promise::Promise( const Environment& env, std::string& name){
? ? ? ?SEXP res = Rf_findVarInFrame( m_sexp, Rf_install(name.c_str()) ?) ;
? ? ? ?if( TYPEOF(res) != PROMSXP){ be unhappy ; }
? ? ? ?setSEXP( res ) ;
}
Promises is a beast I rarely use, so the interface is still in a "to be
improved" state. Suggestions are much welcome, for example pseudo code
chunks of the sort of things one would do with them.
Thanks. Note that in a subsequent post I did list the sorts of operations that would be nice and also did provide some working code -- that code was just intended to show how to check for promises without forcing them and seemed to show that one must descend to a lower level to do this. (That code was not intended to address the question of what is a desirable interface.) R-Forge, hence the rcpp-devel archives, seem to be down right now but you can find this post here: http://www.mail-archive.com/rcpp-devel at lists.r-forge.r-project.org/msg01287.html
Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com