On 12/03/2009 12:17 AM, Michael Lawrence wrote:


On Thu, Nov 19, 2009 at 10:54 AM, Romain Francois
<romain.franc...@dbmail.com <mailto:romain.franc...@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.franc...@dbmail.com <mailto:romain.franc...@dbmail.com>
        <mailto:romain.franc...@dbmail.com
        <mailto:romain.franc...@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

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to