How do I avoid eval and parse? The Next CEO of Stack OverflowAvoiding the infamous “eval(parse())” constructR: eval(parse(…)) is often suboptimalWhy is using the JavaScript eval function a bad idea?When is JavaScript's eval() not evil?How to sort a dataframe by multiple column(s)?How to join (merge) data frames (inner, outer, left, right)What's the difference between eval, exec, and compile?How to make a great R reproducible exampleWhat does Python's eval() do? Avoiding the infamous “eval(parse())” constructUse argument value as variable name in R during function runR: eval parse function call not accessing correct environments

Has this building technique been used in an official set?

How does the mv command work with external drives?

What exact does MIB represent in SNMP? How is it different from OID?

Why has the US not been more assertive in confronting Russia in recent years?

How do I go from 300 unfinished/half written blog posts, to published posts?

If Nick Fury and Coulson already knew about aliens (Kree and Skrull) why did they wait until Thor's appearance to start making weapons?

Limits on contract work without pre-agreed price/contract (UK)

What connection does MS Office have to Netscape Navigator?

What is the result of assigning to std::vector<T>::begin()?

Would a galaxy be visible from outside, but nearby?

Several mode to write the symbol of a vector

Preparing Indesign booklet with .psd graphics for print

Skipping indices in a product

Can you replace a racial trait cantrip when leveling up?

Why do professional authors make "consistency" mistakes? And how to avoid them?

Inappropriate reference requests from Journal reviewers

Why does standard notation not preserve intervals (visually)

Do I need to enable Dev Hub in my PROD Org?

Elegant way to replace substring in a regex with optional groups in Python?

Return the Closest Prime Number

If the heap is initialized for security, then why is the stack uninitialized?

Can I run my washing machine drain line into a condensate pump so it drains better?

Why don't programming languages automatically manage the synchronous/asynchronous problem?

How powerful is the invisibility granted by the Gloom Stalker ranger's Umbral Sight feature?



How do I avoid eval and parse?



The Next CEO of Stack OverflowAvoiding the infamous “eval(parse())” constructR: eval(parse(…)) is often suboptimalWhy is using the JavaScript eval function a bad idea?When is JavaScript's eval() not evil?How to sort a dataframe by multiple column(s)?How to join (merge) data frames (inner, outer, left, right)What's the difference between eval, exec, and compile?How to make a great R reproducible exampleWhat does Python's eval() do? Avoiding the infamous “eval(parse())” constructUse argument value as variable name in R during function runR: eval parse function call not accessing correct environments










11















I have written a function that sources files that contain scripts for other functions and stores these functions in an alternative environment so that they aren't cluttering up the global environment. The code works, but contains two instances of eval(parse(...)):



# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...)
if (environment %in% search())
while (environment %in% search())
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1

cat("detached", counter, environment, "sn")
else cat("no", environment, "attachedn")
if (!environment %in% ls(.GlobalEnv, all.names = T))
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "n")
else cat(environment, "already existsn")
sapply(functions, function(func)
# source(paste0("C:/Users/JT/R/Functions/", func, ".R"), .env)
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "n")
)
# rm(list = functions, pos = .GlobalEnv)
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "nn")



Much has been written about the sub-optimality of the eval(parse(...)) construction (see here and here). However, the discussions that I've found mostly deal with alternate strategies for subsetting. The first instance of eval(parse(...)) in my code doesn't involve subsetting (the second instance might be related to subsetting).



Is there a way to call new.env(...) and [environment name]$[function name] <- [function name] without resorting to eval(parse(...))? Thanks.



N.B.: I don't want to change the names of my functions to .name to hide them in the global environment










share|improve this question






















  • Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

    – Josh
    29 mins ago
















11















I have written a function that sources files that contain scripts for other functions and stores these functions in an alternative environment so that they aren't cluttering up the global environment. The code works, but contains two instances of eval(parse(...)):



# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...)
if (environment %in% search())
while (environment %in% search())
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1

cat("detached", counter, environment, "sn")
else cat("no", environment, "attachedn")
if (!environment %in% ls(.GlobalEnv, all.names = T))
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "n")
else cat(environment, "already existsn")
sapply(functions, function(func)
# source(paste0("C:/Users/JT/R/Functions/", func, ".R"), .env)
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "n")
)
# rm(list = functions, pos = .GlobalEnv)
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "nn")



Much has been written about the sub-optimality of the eval(parse(...)) construction (see here and here). However, the discussions that I've found mostly deal with alternate strategies for subsetting. The first instance of eval(parse(...)) in my code doesn't involve subsetting (the second instance might be related to subsetting).



Is there a way to call new.env(...) and [environment name]$[function name] <- [function name] without resorting to eval(parse(...))? Thanks.



N.B.: I don't want to change the names of my functions to .name to hide them in the global environment










share|improve this question






















  • Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

    – Josh
    29 mins ago














11












11








11








I have written a function that sources files that contain scripts for other functions and stores these functions in an alternative environment so that they aren't cluttering up the global environment. The code works, but contains two instances of eval(parse(...)):



# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...)
if (environment %in% search())
while (environment %in% search())
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1

cat("detached", counter, environment, "sn")
else cat("no", environment, "attachedn")
if (!environment %in% ls(.GlobalEnv, all.names = T))
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "n")
else cat(environment, "already existsn")
sapply(functions, function(func)
# source(paste0("C:/Users/JT/R/Functions/", func, ".R"), .env)
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "n")
)
# rm(list = functions, pos = .GlobalEnv)
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "nn")



Much has been written about the sub-optimality of the eval(parse(...)) construction (see here and here). However, the discussions that I've found mostly deal with alternate strategies for subsetting. The first instance of eval(parse(...)) in my code doesn't involve subsetting (the second instance might be related to subsetting).



Is there a way to call new.env(...) and [environment name]$[function name] <- [function name] without resorting to eval(parse(...))? Thanks.



N.B.: I don't want to change the names of my functions to .name to hide them in the global environment










share|improve this question














I have written a function that sources files that contain scripts for other functions and stores these functions in an alternative environment so that they aren't cluttering up the global environment. The code works, but contains two instances of eval(parse(...)):



# sourceFunctionHidden ---------------------------
# source a function and hide the function from the global environment
sourceFunctionHidden <- function(functions, environment = "env", ...)
if (environment %in% search())
while (environment %in% search())
if (!exists("counter", inherits = F)) counter <- 0
eval(parse(text = paste0("detach(", environment, ")")))
counter <- counter + 1

cat("detached", counter, environment, "sn")
else cat("no", environment, "attachedn")
if (!environment %in% ls(.GlobalEnv, all.names = T))
assign(environment, new.env(), pos = .GlobalEnv)
cat("created", environment, "n")
else cat(environment, "already existsn")
sapply(functions, function(func)
# source(paste0("C:/Users/JT/R/Functions/", func, ".R"), .env)
source(paste0("C:/Users/JT/R/Functions/", func, ".R"))
eval(parse(text = paste0(environment, "$", func," <- ", func)))
cat(func, "created in", environment, "n")
)
# rm(list = functions, pos = .GlobalEnv)
eval(parse(text = paste0("attach(", environment, ")")))
cat("attached", environment, "nn")



Much has been written about the sub-optimality of the eval(parse(...)) construction (see here and here). However, the discussions that I've found mostly deal with alternate strategies for subsetting. The first instance of eval(parse(...)) in my code doesn't involve subsetting (the second instance might be related to subsetting).



Is there a way to call new.env(...) and [environment name]$[function name] <- [function name] without resorting to eval(parse(...))? Thanks.



N.B.: I don't want to change the names of my functions to .name to hide them in the global environment







r eval






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 4 hours ago









JoshJosh

300113




300113












  • Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

    – Josh
    29 mins ago


















  • Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

    – Josh
    29 mins ago

















Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

– Josh
29 mins ago






Just discovered that eval(parse(text = paste0("detach(", environment, ")"))) can be replaced with detach(environment, character.only = T). The question about improving eval(parse(text = paste0("attach(", environment, ")"))) remains.

– Josh
29 mins ago













2 Answers
2






active

oldest

votes


















4














For what its worth, the function source actually uses eval(parse(...)), albeit in a somewhat subtle way. First, .Internal(parse(...)) is used to create expressions, which after more processing are later passed to eval. So eval(parse(...)) seems to be good enough for the R core team in this instance.



That said, you don't need to jump through hoops to source functions into a new environment. source provides an argument local that can be used for precisely this.




local: TRUE, FALSE or an environment, determining where the parsed expressions are evaluated.




An example:



env = new.env()
source('test.r', local = env)


testing it works:



env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)


And an example test.r file to use this on:



test = function(a,b) paste(a,b)





share|improve this answer























  • Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

    – Josh
    20 mins ago












  • You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

    – dww
    5 mins ago



















3














If you want to keep it off global_env, put it into a package. It's common for people in the R community to put a bunch of frequently used helper functions into their own personal package.






share|improve this answer























  • I agree. I eventually need to learn how to do this.

    – Josh
    27 mins ago











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55426015%2fhow-do-i-avoid-eval-and-parse%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









4














For what its worth, the function source actually uses eval(parse(...)), albeit in a somewhat subtle way. First, .Internal(parse(...)) is used to create expressions, which after more processing are later passed to eval. So eval(parse(...)) seems to be good enough for the R core team in this instance.



That said, you don't need to jump through hoops to source functions into a new environment. source provides an argument local that can be used for precisely this.




local: TRUE, FALSE or an environment, determining where the parsed expressions are evaluated.




An example:



env = new.env()
source('test.r', local = env)


testing it works:



env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)


And an example test.r file to use this on:



test = function(a,b) paste(a,b)





share|improve this answer























  • Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

    – Josh
    20 mins ago












  • You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

    – dww
    5 mins ago
















4














For what its worth, the function source actually uses eval(parse(...)), albeit in a somewhat subtle way. First, .Internal(parse(...)) is used to create expressions, which after more processing are later passed to eval. So eval(parse(...)) seems to be good enough for the R core team in this instance.



That said, you don't need to jump through hoops to source functions into a new environment. source provides an argument local that can be used for precisely this.




local: TRUE, FALSE or an environment, determining where the parsed expressions are evaluated.




An example:



env = new.env()
source('test.r', local = env)


testing it works:



env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)


And an example test.r file to use this on:



test = function(a,b) paste(a,b)





share|improve this answer























  • Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

    – Josh
    20 mins ago












  • You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

    – dww
    5 mins ago














4












4








4







For what its worth, the function source actually uses eval(parse(...)), albeit in a somewhat subtle way. First, .Internal(parse(...)) is used to create expressions, which after more processing are later passed to eval. So eval(parse(...)) seems to be good enough for the R core team in this instance.



That said, you don't need to jump through hoops to source functions into a new environment. source provides an argument local that can be used for precisely this.




local: TRUE, FALSE or an environment, determining where the parsed expressions are evaluated.




An example:



env = new.env()
source('test.r', local = env)


testing it works:



env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)


And an example test.r file to use this on:



test = function(a,b) paste(a,b)





share|improve this answer













For what its worth, the function source actually uses eval(parse(...)), albeit in a somewhat subtle way. First, .Internal(parse(...)) is used to create expressions, which after more processing are later passed to eval. So eval(parse(...)) seems to be good enough for the R core team in this instance.



That said, you don't need to jump through hoops to source functions into a new environment. source provides an argument local that can be used for precisely this.




local: TRUE, FALSE or an environment, determining where the parsed expressions are evaluated.




An example:



env = new.env()
source('test.r', local = env)


testing it works:



env$test('hello', 'world')
# [1] "hello world"
ls(pattern = 'test')
# character(0)


And an example test.r file to use this on:



test = function(a,b) paste(a,b)






share|improve this answer












share|improve this answer



share|improve this answer










answered 2 hours ago









dwwdww

15.9k32659




15.9k32659












  • Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

    – Josh
    20 mins ago












  • You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

    – dww
    5 mins ago


















  • Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

    – Josh
    20 mins ago












  • You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

    – dww
    5 mins ago

















Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

– Josh
20 mins ago






Thank you, I missed that aspect of source(). However, if I change that line of code to source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) I get the error Error in source(paste0("C:/Users/JT/R/Functions/", func, ".R"), local = environment) : 'local' must be TRUE, FALSE or an environment. Is there a way to convert the "env" that comes from environment to env?

– Josh
20 mins ago














You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

– dww
5 mins ago






You should create an environment to save into. For example as I demonstrated with env = new.env(). Then pass the environment as your argument (in this case env)

– dww
5 mins ago














3














If you want to keep it off global_env, put it into a package. It's common for people in the R community to put a bunch of frequently used helper functions into their own personal package.






share|improve this answer























  • I agree. I eventually need to learn how to do this.

    – Josh
    27 mins ago















3














If you want to keep it off global_env, put it into a package. It's common for people in the R community to put a bunch of frequently used helper functions into their own personal package.






share|improve this answer























  • I agree. I eventually need to learn how to do this.

    – Josh
    27 mins ago













3












3








3







If you want to keep it off global_env, put it into a package. It's common for people in the R community to put a bunch of frequently used helper functions into their own personal package.






share|improve this answer













If you want to keep it off global_env, put it into a package. It's common for people in the R community to put a bunch of frequently used helper functions into their own personal package.







share|improve this answer












share|improve this answer



share|improve this answer










answered 3 hours ago









thcthc

5,37611224




5,37611224












  • I agree. I eventually need to learn how to do this.

    – Josh
    27 mins ago

















  • I agree. I eventually need to learn how to do this.

    – Josh
    27 mins ago
















I agree. I eventually need to learn how to do this.

– Josh
27 mins ago





I agree. I eventually need to learn how to do this.

– Josh
27 mins ago

















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55426015%2fhow-do-i-avoid-eval-and-parse%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How does Billy Russo acquire his 'Jigsaw' mask? Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara Favourite questions and answers from the 1st quarter of 2019Why does Bane wear the mask?Why does Kylo Ren wear a mask?Why did Captain America remove his mask while fighting Batroc the Leaper?How did the OA acquire her wisdom?Is Billy Breckenridge gay?How does Adrian Toomes hide his earnings from the IRS?What is the state of affairs on Nootka Sound by the end of season 1?How did Tia Dalma acquire Captain Barbossa's body?How is one “Deemed Worthy”, to acquire the Greatsword “Dawn”?How did Karen acquire the handgun?

Личност Атрибути на личността | Литература и източници | НавигацияРаждането на личносттаредактиратередактирате

A sequel to Domino's tragic life Why Christmas is for Friends Cold comfort at Charles' padSad farewell for Lady JanePS Most watched News videos