On Sep 8, 2011, at 9:13 AM, Bos, Roger wrote:

I modified an example in the object.size help page to create a function
I want to be able to run:

"mysize" <- function() {
   z <- sapply(ls(), function(w) object.size(get(w)))
   as.matrix(rev(sort(z))[1:5])
}
mysize()

When I test the lines inside the function it works fine:

   z <- sapply(ls(), function(w) object.size(get(w)))

   as.matrix(rev(sort(z))[1:5])
            [,1]
mat     166344288
mod     130794704
zidx       799664
wfidx      799664
megacap    799664


But when I try to run the function, it produces an error:

"mysize" <- function() {
+     z <- sapply(ls(), function(w) object.size(get(w)))
+     as.matrix(rev(sort(z))[1:5])
+ }

mysize()
Error in rev(sort(z)) :
 error in evaluating the argument 'x' in selecting a method for
function 'rev': Error in sort.int(x, na.last = na.last, decreasing =
decreasing, ...) :
 'x' must be atomic


It must be a variable scoping problem, but I am not sure how to tackle
it.

I would have called it a function scoping problem. Inside the function ls() will not "see" the global environment unless you tell it where to look. (It may even be two levels deeper than the globalenv() when called inside `sapply`.) When called without an environment, it just looks in parent.frame which is inside the function.

"mysize" <- function() {
     z <- sapply(ls(env=globalenv()), function(w) object.size(get(w)))
     as.matrix(rev(sort(z))[1:5])
 }

#works for me.


--
David Winsemius, MD
West Hartford, CT

______________________________________________
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.

Reply via email to