Skip to content
Prev 6358 / 12125 Next

[R-pkg-devel] Assigning a variable to global environment

Tiago, this may be a dumb question but what you are trying to do (below) sounds very similar to an existing function called attach() which many suggest has some dangers in use as you can overwrite or hide user variables or it can be eclipsed by later code:

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/attach

Your version does try to use a secondary name if there is a clash but note if it is called repeatedly, it will make a tertiary and quaternary and beyond name by appending multiple copies of "_vct" one after another. I have seen people do this when making a unique tmp file.

And you do not show if these variable stuffed into an environment are eventually removed. Consider the variant described here:

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/with

For clarity, you would use attach or with using a subset the columns of your data.frame that had just the variables you want.

A simple question is what the purpose of your change is. You want other functions run later to see these variables in their environment. Must they be global or can they be in an environment high enough in their search path. Some methods can make the change temporary and will unwind them. Some may keep the change permanent till the end of the session. 

I find that although it is tempting in base R to shorten use of names like $df$var_name to just var_name, use of a tidyverse package gets around it in a more limited way that does not so much impact what other functions see in the environment.

-----Original Message-----
From: R-package-devel <r-package-devel-bounces at r-project.org> On Behalf Of Tiago Olivoto
Sent: Friday, December 11, 2020 2:12 PM
To: Ben Bolker <bbolker at gmail.com>
Cc: R Package Devel <r-package-devel at r-project.org>
Subject: Re: [R-pkg-devel] Assigning a variable to global environment

Thanks, everyone,

Following Mark suggestion:

The problem I'm trying to solve is:
Users of my package metan (https://CRAN.R-project.org/package=metan),
sometimes need to extract 2-3 variables from a given data.frame and put them as vectors in the global environment to use in other package's functions.
Given that df has the columns, ENV, GEN, REP, I would need to run the following codes ENV <- df$ENV GEN <- df$GEN REP <- df$GEN I'm looking for a more efficient way to do that and just finished the following function

as_vector <- function(.data, ...){
  if(missing(...)){
    df <- select(.data, everything())
  } else{
    df <- select(.data, ...)
  }
  for(i in 1:ncol(df)){
    var_name <- names(df[i])
    var_name <- ifelse(exists(var_name, envir = .GlobalEnv),
                         paste(var_name, "_vct", sep = ""),
                         var_name)
    assign(var_name, as.vector(df[[i]]), envir = .GlobalEnv)
  }
}

Then, users could simply run as_vector(df) or  as_vector(df, GEN, ENV) But I'm not sure if this fits with the CRAN policies.
Cherss,
Tiago

Em sex., 11 de dez. de 2020 ?s 16:03, Ben Bolker <bbolker at gmail.com>
escreveu:
______________________________________________
R-package-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel


Scanned by McAfee and confirmed virus-free.	
Find out more here: https://bit.ly/2zCJMrO