[R] Help understanding environments

Rui Barradas ruipbarradas at sapo.pt
Tue Jun 18 16:56:45 CEST 2013


Hello,

The first argument to exists() must be the name of an object given as a 
character string, as stated in the help page. See ?exists. You have also 
forgot to initialize combined to NULL, this time.
Your function revised would then become


c_objects <- function(FILES) {
   combined <- NULL
   for (FILE in FILES) {
     load(FILE)
     if (exists("combined")) {
       combined <- c(combined, res)
     } else {
       combined <- res
     }
   }
   return(combined)
}


And all works as expected.

Hope this helps,

Rui Barradas


Em 18-06-2013 14:57, Davis, Brian escreveu:
> In my haste to make a smaller example than my actual code I used 'is.null' instead of 'exists' as is in my code.  Here's a small reproducible example
>
>
> res <- list(abc=letters, ABC=LETTERS)
> save(res, file="results.RData")
> res <- list(zyx=rev(letters), ZYX=rev(LETTERS))
> save(res, file="results2.RData")
>
> rm(res)
> FILES <- c("results.RData", "results2.RData")
>
>
> c_objects <- function(FILES) {
>    for (FILE in FILES) {
>      load(FILE)
>      if (exists(combined)) {
>        combined <- c(combined, res)
>      } else {
>        combined <- res
>      }
>    }
>    return(combined)
> }
>
> combined_results <- c_objects(FILES)
>
>
> -----Original Message-----
> From: Duncan Murdoch [mailto:murdoch.duncan at gmail.com]
> Sent: Monday, June 17, 2013 5:40 PM
> To: Davis, Brian
> Cc: r-help at r-project.org
> Subject: Re: [R] Help understanding environments
>
> On 13-06-17 5:02 PM, Davis, Brian wrote:
>> I have a collection of .RData files that have result objects that I would like to combine.  Specifically, skatCohort objects from the skatMeta package, but I've run into a similar issue with simple data.frames also.
>>
>> If I run something like
>>
>> FILES <- list.files(path="/path/to/my/results", pattern=".RData$",
>> full.names=TRUE) combined <- NULL
>>     for (FILE in FILES) {
>>       load(FILE)
>>       if (!is.null(combined)) {
>>         combined <- c(combined, res)
>>       } else {
>>         combined <- res
>>       }
>>     }
>>
>> I get all my objects combined.  However, if I wrap this into a
>> function I get the following error
>>
>> c_objects <- function(FILES) {
>>     combined <- NULL
>>     for (FILE in FILES) {
>>       load(FILE)
>>       if (!is.null(combined)) {
>>         combined <- c(combined, res)
>>       } else {
>>         combined <- res
>>       }
>>     }
>>     return(combined)
>> }
>>
>> combined_results <- c_objects(FILES)
>> Error in eval(expr, envir, enclos) : object 'combined' not found
>>
>> How should I write this function such that it can find "combined".   I've tried reading the help on envirnaments, and the exisits function but I haven't been able to figure this out.  Are there any other resources to read up on this?
>
> You are doing something that you aren't showing us:  I don't see any calls to eval(), but it's eval() that generated the error.
>
> Calling traceback() after the error might be informative.
>
> Duncan Murdoch
>



More information about the R-help mailing list