[Rd] combine UserDefinedDatabase and regular environments

Romain Francois romain.francois at dbmail.com
Thu Dec 3 08:11:25 CET 2009


On 12/03/2009 12:17 AM, Michael Lawrence wrote:
>
>
> On Thu, Nov 19, 2009 at 10:54 AM, Romain Francois
> <romain.francois at dbmail.com <mailto:romain.francois at dbmail.com>> wrote:
>
>     On 11/19/2009 06:14 PM, Michael Lawrence wrote:
>
>
>
>         On Thu, Nov 5, 2009 at 9:58 AM, Romain Francois
>         <romain.francois at dbmail.com <mailto:romain.francois at dbmail.com>
>         <mailto:romain.francois at dbmail.com
>         <mailto:romain.francois at dbmail.com>>> wrote:
>
>             Hello,
>
>             Is it possible to have the effect of UserDefinedDatabase
>         outside of
>         "attached" environments ? Can I disguise an environment of the
>             sys.frames() as a UserDefinedDatabase ?
>
>             This seems to suggest that it might be possible :
>
>          > f <- function(){ e <- environment(); class(e) <-
>         "UserDefinedDatabase"; ff }
>          > f()
>
>
>         The UserDefinedDatabase support expects an R_ObjectTable C structure
>         embedded within an externalptr as the HASHTAB of the environment. So
>         it's really only possible from C.
>
>
>     Sure. Too bad both environments and user defined database use
>     HASHTAB with completely different meanings.
>
>     What I would want is something like this:
>
>     f <- function(){
>             attachLocally( getSomeUserDefinedDatabaseFromC()  )
>             HELLO
>     }
>
>     and the variable associated with the binding "HELLO" would come
>     dynamically from the user defined database.
>
>
>     A more concrete example : rJava now has javaImport, that combined
>     with attach allows dynamic lookup for class names within a set of
>     imported java package paths:
>
>     attach( javaImport( "java.util" ), name = "java:java.util" )
>     v <- new( Vector )
>     m <- new( HashMap )
>
>     This is nice, but then as usual with attach, you forget to detach,
>     ... this question is about to find a way to have this instead:
>
>     f <- function(){
>             import( "java.util" )
>             v <- new( Vector )
>             v$add( 1 )
>             v
>     }
>
>     where the "java.util" is no more looked up when f returns.
>
>
>
> Probably no clean way to accomplish that. But you could always use
> with() if you can get that Java package as an environment.

Thanks for keeping this live. This would work if there was a way to 
enumerate classes from a java package, which is not always possible 
because of the flexibility of the java class loader mechanism. You can 
for example quite easily create a class loader that generates an 
infinity of classes ...

Romain

> Or use
> environment<-() to enclose your function in it. That's actually fairly
> Java-like, as normally the import has file scope and your classes are
> enclosed within that file.
>
> Michael


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/Gq7i : ohloh
|- http://tr.im/FtUu : new package : highlight
`- http://tr.im/EAD5 : LondonR slides



More information about the R-devel mailing list