[R] Can the environment of a function be specified when the function is defined?

2011-08-12 Thread Frederic F
Hello, 

Is there a syntax to set the environment of a function when this function is
defined? 

The best I could come up with so far is using a wrapper function:

foo_internals- function(x) {Code of the function}

foo- function(x) {
  environment(foo_internals)-as.environment(target_environment)
  foo_internals(x)
}

But I would like to know if there is a cleaner syntax.

There are two reasons why I would like to have a function defined with an
environment different then the local one:
The first is to develop a function that will go in a package: there might be
more things loaded in my R_GlobalEnv than what will be available to the
function when its environment will be the namespace of the package, so I
would like to restrict right away the environment of the function that I
develop in my local enviroment to what will be their environment in 'real
life'.  
The other reason would be to have a function written in a package act as if
it was from another package by giving it the environment of this other
package. 

Thanks for your suggestions and comments,

Frederic

--
View this message in context: 
http://r.789695.n4.nabble.com/Can-the-environment-of-a-function-be-specified-when-the-function-is-defined-tp3739482p3739482.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] How to quickly convert a data.frame into a structure of lists

2011-08-10 Thread Frederic F
Hello Duncan,  

Here is a small example to illustrate what I am trying to do.

# Example data.frame
df=data.frame(A=c(a,a,b,b), B=c(X,X,Y,Z), C=c(1,2,3,4)) 
#   A B C
# 1 a X 1
# 2 a X 2
# 3 b Y 3
# 4 b Z 4

### First way of getting the list structure (ls1) using imbricated lapply
loops:
# Get the structure and populate it:
ls1-lapply(levels(df$A), function(levelA) { 
  lapply(levels(df$B), function(levelB) {df$C[df$A==levelA 
df$B==levelB]})
})
# Apply the names:
names(list_structure)-levels(df$A)
for (i in 1:length(list_structure))
{names(list_structure[[i]])-levels(df$B)}

# Result:
ls1$a$X
# [1] 1 2
ls1$b$Z
# [1] 4

The data.frame will always be 'complete', i.e., there will be a value in
every row for every column. 
I want to produce a structure like this one quickly (I aim at something
below 10 seconds) for a dataset containing between 1 and 2 millions of rows. 

I hope that this helps clarify things.

Thanks for your help,

Frederic 

--
View this message in context: 
http://r.789695.n4.nabble.com/How-to-quickly-convert-a-data-frame-into-a-structure-of-lists-tp3731746p3733073.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] How to quickly convert a data.frame into a structure of lists

2011-08-10 Thread Frederic F
Hello Denis,

 To borrow shamelessly from one of the prominent helpers on this list:
 What is the problem you're trying to solve?    (attribution: Jim Holtman)

I'm trying to connect two sets of legacy R tools: the output of the
first one can be transformed in a data.frame without loss of
information, the input of the second one takes the form of a structure
of list.

  it's entirely possible
 that there may be a nice 'R way' to do it. Read the posting guide and
 if at all possible, provide a small, reproducible example that
 demonstrates what you want to accomplish.

Here is the first way attacked the problems illustrated on a tiny
dataset (this way does not work quickly enough on a real dataset
unfortunately):

df=data.frame(A=c(a,a,b,b), B=c(X,X,Y,Z), C=c(1,2,3,4))

# Get the structure and populate it:
ls1-lapply(levels(df$A), function(levelA) {
  lapply(levels(df$B), function(levelB) {df$C[df$A==levelA  df$B==levelB]})
})
# Get the names:
names(list_structure)-levels(df$A)
for (i in 1:length(list_structure)) {names(list_structure[[i]])-levels(df$B)}

# Results:
ls1$a$X
# [1] 1 2
ls1$b$Z
# [1] 4

Thanks for your help,

Frederic


--
View this message in context: 
http://r.789695.n4.nabble.com/How-to-quickly-convert-a-data-frame-into-a-structure-of-lists-tp3731746p3733114.html
Sent from the R help mailing list archive at Nabble.com.
[[alternative HTML version deleted]]

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


[R] How to quickly convert a data.frame into a structure of lists

2011-08-09 Thread Frederic F
Hello,

This is my first project in R, so I'm trying to work 'the R way', but it
still feels awkward sometimes.

The problem that I'm facing right now is that I need to convert a data.frame
into a structure of lists. The data.frame has columns in the order of tens
(I need to focus on only three of them) and rows in the order of millions.
So it's quite a big dataset. 
Let say that the columns of interest are A, B and C. I need to take the
data.frame and construct a structure of list where I have a list for every
level of A, those list all contain lists for every levels of B, and the
'b-lists' contains all the values of C that match the corresponding levels
of A and B. 
So, I should be able to write something like this:
 MyData@list_structure$x_level_of_A$y_level_of_B
and get a vector of the values of C that were on rows where A=x_level_of_A
and B=y_level_of_B.

My first attempt was to use two imbricated lapply functions running
something like this:

list_structure-lapply(levels(A) function(x) {
  as.character(x) = lapply( levels(B), function(y) {
as.character(y) = C[A==x  B==y]
  })
})

The real code was not quite as simple, but I managed to have it work, and it
worked well on my first dataset (where A and B had only few levels). I was
quite happy... but the imbricated loops killed me on a second dataset where
A had several thousand levels. So I tried something else.

My second attempt was to go through every row of the data.frame and append
the value to the appropriate vector. 

I first initialized a structure of lists ending with NULL vector, then I did
something like this:

for (i in 1:nrow(DataFrame)) {
  eval(
substitute(
  append(MyData@list_structure$a_value$b_value, c_value),
  list(a_value=as.character(DF$A[i]), b_value=as.character(DF$B[i]),
c_value=as.character(DF$C[i]))
)
  )
}

This works... but way too slowly for my purpose. 

I would like to know if there is a better road to take to do this
transformation. Or, if there is a way of speeding one of the two solutions
that I have tried.

Thank you very much for your help!

(And in your replies, please remember that this is my first project in R, so
don't hesitate to state the obvious if it seems like I am missing it!)

Frederic

--
View this message in context: 
http://r.789695.n4.nabble.com/How-to-quickly-convert-a-data-frame-into-a-structure-of-lists-tp3731746p3731746.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.