[R-pkg-devel] Assigning a variable to global environment
Hi everyone, This can be a very simple question, but I really have the following doubt. CRAN Policies says that 'Packages should not modify the global environment (user’s workspace)'. So, may I or may I not create a function that will call internally the following code? (a simple example) assign("name", 1, envir = .GlobalEnv) Cheers Tiago [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
Re: [R-pkg-devel] Assigning a variable to global environment
> On 11 Dec 2020, at 18:32, Tiago Olivoto wrote: > > Hi everyone, > This can be a very simple question, but I really have the following doubt. > > CRAN Policies says that 'Packages should not modify the global environment > (user’s workspace)'. So, may I or may I not create a function that will > call internally the following code? (a simple example) > > assign("name", 1, envir = .GlobalEnv) You may not - and for good reason, as the user may have an existing variable called “name” that will be destroyed by such an action. If you run "R CMD check —as-cran" on a package containing this code you will get a warning (or maybe a note, I can’t remember), and the package would most likely be refused if you tried to submit it to CRAN. Cheers, Matt > > Cheers > Tiago > > [[alternative HTML version deleted]] > > __ > R-package-devel@r-project.org mailing list > https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
Re: [R-pkg-devel] Assigning a variable to global environment
Thank Matt for your response. Would be an acceptable solution to check if the variable exists first and creating the new variable with a suffix? Please, see the following example var_name <- "name" var_name <- ifelse(exists(var_name), paste(var_name, "_vct", sep = ""), var_name) and then assign(var_name, 1, envir = .GlobalEnv) Cheers, Tiago Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood escreveu: > > > On 11 Dec 2020, at 18:32, Tiago Olivoto wrote: > > > > Hi everyone, > > This can be a very simple question, but I really have the following > doubt. > > > > CRAN Policies says that 'Packages should not modify the global > environment > > (user’s workspace)'. So, may I or may I not create a function that will > > call internally the following code? (a simple example) > > > > assign("name", 1, envir = .GlobalEnv) > > You may not - and for good reason, as the user may have an existing > variable called “name” that will be destroyed by such an action. If you > run "R CMD check —as-cran" on a package containing this code you will get a > warning (or maybe a note, I can’t remember), and the package would most > likely be refused if you tried to submit it to CRAN. > > Cheers, > > Matt > > > > > > Cheers > > Tiago > > > > [[alternative HTML version deleted]] > > > > __ > > R-package-devel@r-project.org mailing list > > > https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 > > [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
Re: [R-pkg-devel] Assigning a variable to global environment
I think this solution will *not* be acceptable to CRAN. (The policy doesn't say "don't modify the global workspace unless you're careful", it says "don't modify the global workspace".) You can ask for an exception, but your chances of success are very low. It would be best to find a way to solve your problem without assigning to the global workspace. Can you assign to an environment that is contained within your package, which all of the functions in your package will also have access to? cheers Ben Bolker On 12/11/20 1:52 PM, Tiago Olivoto wrote: Thank Matt for your response. Would be an acceptable solution to check if the variable exists first and creating the new variable with a suffix? Please, see the following example var_name <- "name" var_name <- ifelse(exists(var_name), paste(var_name, "_vct", sep = ""), var_name) and then assign(var_name, 1, envir = .GlobalEnv) Cheers, Tiago Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood escreveu: On 11 Dec 2020, at 18:32, Tiago Olivoto wrote: Hi everyone, This can be a very simple question, but I really have the following doubt. CRAN Policies says that 'Packages should not modify the global environment (user’s workspace)'. So, may I or may I not create a function that will call internally the following code? (a simple example) assign("name", 1, envir = .GlobalEnv) You may not - and for good reason, as the user may have an existing variable called “name” that will be destroyed by such an action. If you run "R CMD check —as-cran" on a package containing this code you will get a warning (or maybe a note, I can’t remember), and the package would most likely be refused if you tried to submit it to CRAN. Cheers, Matt Cheers Tiago [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
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 escreveu: >I think this solution will *not* be acceptable to CRAN. (The policy > doesn't say "don't modify the global workspace unless you're careful", > it says "don't modify the global workspace".) You can ask for an > exception, but your chances of success are very low. > > It would be best to find a way to solve your problem without > assigning to the global workspace. Can you assign to an environment > that is contained within your package, which all of the functions in > your package will also have access to? > >cheers > Ben Bolker > > On 12/11/20 1:52 PM, Tiago Olivoto wrote: > > Thank Matt for your response. > > Would be an acceptable solution to check if the variable exists first and > > creating the new variable with a suffix? Please, see the following > example > > > > var_name <- "name" > > var_name <- ifelse(exists(var_name), > > paste(var_name, "_vct", sep = ""), > > var_name) > > and then > > > > assign(var_name, 1, envir = .GlobalEnv) > > > > Cheers, > > Tiago > > > > Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood > escreveu: > > > >> > >>> On 11 Dec 2020, at 18:32, Tiago Olivoto > wrote: > >>> > >>> Hi everyone, > >>> This can be a very simple question, but I really have the following > >> doubt. > >>> > >>> CRAN Policies says that 'Packages should not modify the global > >> environment > >>> (user’s workspace)'. So, may I or may I not create a function that will > >>> call internally the following code? (a simple example) > >>> > >>> assign("name", 1, envir = .GlobalEnv) > >> > >> You may not - and for good reason, as the user may have an existing > >> variable called “name” that will be destroyed by such an action. If you > >> run "R CMD check —as-cran" on a package containing this code you will > get a > >> warning (or maybe a note, I can’t remember), and the package would most > >> likely be refused if you tried to submit it to CRAN. > >> > >> Cheers, > >> > >> Matt > >> > >> > >>> > >>> Cheers > >>> Tiago > >>> > >>>[[alternative HTML version deleted]] > >>> > >>> __ > >>> R-package-devel@r-project.org mailing list > >>> > >> > https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 > >> > >> > > > > [[alternative HTML version deleted]] > > > > __ > > R-package-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-package-devel > > > > __ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
Re: [R-pkg-devel] Assigning a variable to global environment
I think it would be helpful to describe more deeply what you're trying to do by this. There's a fair chance there's a better way to do what you're trying to do. Mark On Fri, Dec 11, 2020 at 10:53 AM Tiago Olivoto wrote: > Thank Matt for your response. > Would be an acceptable solution to check if the variable exists first and > creating the new variable with a suffix? Please, see the following example > > var_name <- "name" > var_name <- ifelse(exists(var_name), > paste(var_name, "_vct", sep = ""), > var_name) > and then > > assign(var_name, 1, envir = .GlobalEnv) > > Cheers, > Tiago > > Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood > escreveu: > > > > > > On 11 Dec 2020, at 18:32, Tiago Olivoto > wrote: > > > > > > Hi everyone, > > > This can be a very simple question, but I really have the following > > doubt. > > > > > > CRAN Policies says that 'Packages should not modify the global > > environment > > > (user’s workspace)'. So, may I or may I not create a function that will > > > call internally the following code? (a simple example) > > > > > > assign("name", 1, envir = .GlobalEnv) > > > > You may not - and for good reason, as the user may have an existing > > variable called “name” that will be destroyed by such an action. If you > > run "R CMD check —as-cran" on a package containing this code you will > get a > > warning (or maybe a note, I can’t remember), and the package would most > > likely be refused if you tried to submit it to CRAN. > > > > Cheers, > > > > Matt > > > > > > > > > > Cheers > > > Tiago > > > > > > [[alternative HTML version deleted]] > > > > > > __ > > > R-package-devel@r-project.org mailing list > > > > > > https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 > > > > > > [[alternative HTML version deleted]] > > __ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > [[alternative HTML version deleted]] __ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel
Re: [R-pkg-devel] Assigning a variable to global environment
Correct me if I'm wrong, but this seems to be the purpose of the function `with`? https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/with If that's the feature you're looking for, it would be the case of informing your users to use that function when they want to refer to the columns without the $. On Fri, Dec 11, 2020 at 11:13 AM Tiago Olivoto wrote: > 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 > escreveu: > > >I think this solution will *not* be acceptable to CRAN. (The policy > > doesn't say "don't modify the global workspace unless you're careful", > > it says "don't modify the global workspace".) You can ask for an > > exception, but your chances of success are very low. > > > > It would be best to find a way to solve your problem without > > assigning to the global workspace. Can you assign to an environment > > that is contained within your package, which all of the functions in > > your package will also have access to? > > > >cheers > > Ben Bolker > > > > On 12/11/20 1:52 PM, Tiago Olivoto wrote: > > > Thank Matt for your response. > > > Would be an acceptable solution to check if the variable exists first > and > > > creating the new variable with a suffix? Please, see the following > > example > > > > > > var_name <- "name" > > > var_name <- ifelse(exists(var_name), > > > paste(var_name, "_vct", sep = ""), > > > var_name) > > > and then > > > > > > assign(var_name, 1, envir = .GlobalEnv) > > > > > > Cheers, > > > Tiago > > > > > > Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood > > escreveu: > > > > > >> > > >>> On 11 Dec 2020, at 18:32, Tiago Olivoto > > wrote: > > >>> > > >>> Hi everyone, > > >>> This can be a very simple question, but I really have the following > > >> doubt. > > >>> > > >>> CRAN Policies says that 'Packages should not modify the global > > >> environment > > >>> (user’s workspace)'. So, may I or may I not create a function that > will > > >>> call internally the following code? (a simple example) > > >>> > > >>> assign("name", 1, envir = .GlobalEnv) > > >> > > >> You may not - and for good reason, as the user may have an existing > > >> variable called “name” that will be destroyed by such an action. If > you > > >> run "R CMD check —as-cran" on a package containing this code you will > > get a > > >> warning (or maybe a note, I can’t remember), and the package would > most > > >> likely be refused if you tried to submit it to CRAN. > > >> > > >> Cheers, > > >> > > >> Matt > > >> > > >> > > >>> > > >>> Cheers > > >>> Tiago > > >>> > > >>>[[alternative HTML version deleted]] > > >>> > > >>> __ > > >>> R-package-devel@r-project.org mailing list > > >>> > > >> > > > https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-package-devel&data=04%7C01%7Cmd%40sund.ku.dk%7C42392098d3324de389b008d89dfad39d%7Ca3927f91cda14696af898c9f1ceffa91%7C0%7C0%7C637433048371869663%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&sdata=NFTbsJDlZNQWajN%2F%2BeftuclrkJSGtTnM9kEtobn9VLs%3D&reserved=0 > > >> > > >> > > > > > > [[alternative HTML version deleted]] > > > > > > __ > > > R-package-devel@r-project.org mailing list > > > https://stat.ethz.ch/mailman/listinfo/r-package-devel > > > > > > > __ > > R-package-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-package-devel > > > > [[alternative HTML version deleted]] > > __ > R-package-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-package-devel > [[alternativ
Re: [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 On Behalf Of Tiago Olivoto Sent: Friday, December 11, 2020 2:12 PM To: Ben Bolker Cc: R Package Devel 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 escreveu: >I think this solution will *not* be acceptable to CRAN. (The policy > doesn't say "don't modify the global workspace unless you're careful", > it says "don't modify the global workspace".) You can ask for an > exception, but your chances of success are very low. > > It would be best to find a way to solve your problem without > assigning to the global workspace. Can you assign to an environment > that is contained within your package, which all of the functions in > your package will also have access to? > >cheers > Ben Bolker > > On 12/11/20 1:52 PM, Tiago Olivoto wrote: > > Thank Matt for your response. > > Would be an acceptable solution to check if the variable exists > > first and creating the new variable with a suffix? Please, see the > > following > example > > > > var_name <- "name" > > var_name <- ifelse(exists(var_name), > > paste(var_name, "_vct", sep = ""), > > var_name) > > and then > > > > assign(var_name, 1, envir = .GlobalEnv) > > > > Cheers, > > Tiago > > > > Em sex., 11 de dez. de 2020 às 15:20, Matt Denwood > escreveu: > > > >> > >>> On 11 Dec 2020, at 18:32, Tiago Olivoto > wrote: > >>> > >>> Hi everyone, > >>> This can be a very simple question, but I really have the > >>> following > >> doubt. > >>> > >>> CRAN Policies says that 'Packages should not modify the global > >> environment > >>> (user’s workspace)'. So, may I or may I not create a function that > >>> will call internally the following code? (a simple example) > >>> > >>> assign("name", 1, envir = .GlobalEnv) > >> > >> You may not - and for good reason, as the user may have an existing > >> variable called “name” that will be destroyed by such an action. > >> If you run "R CMD check —as-cran" on a package containing this code > >> you will > get a > >> warning (or maybe a note, I can’t remember), and the package would > >> most likely be refused if you tried to submit it to CRAN. > >> > >> Cheers, > >> > >> Matt > >> > >> > >>> > >>> Cheers > >>> Tiago > >>> > >>>