[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