Skip to content

Instantly share code, notes, and snippets.

@TobCap
Last active December 21, 2015 03:59
Show Gist options
  • Select an option

  • Save TobCap/6246295 to your computer and use it in GitHub Desktop.

Select an option

Save TobCap/6246295 to your computer and use it in GitHub Desktop.
# see ?do.call
# The second argument in do.call are evaluated in the calling environmnet before passing to Internal function.
# If an original function requires its arguments as expression, language, or call objects,
# they are needed to be quoted, or set do.call option as quote = TRUE.
D(quote(x^5), "x") # works
do.call(D, list(quote(x^5), "x")) # not work
do.call(D, list(quote(x^5), "x"), quote = TRUE) # works
do.call(D, list(quote(quote(x^5)), "x")) # works
eval(call("D", quote(x^5), "x")) # not work
eval(call("D", quote(quote(x^5)), "x")) # works
eval(as.call(list(D, quote(x^5), "x"))) # not work
eval(as.call(list(D, quote(quote(x^5)), "x"))) # works
### environment's effect
myenv <- new.env(parent = emptyenv())
assign("g", function(x) x^2, myenv)
assign("val", 10, myenv)
g <- function(x) x / 2
val <- 9
do.call(g, list(val), envir = myenv) # 4.5
do.call("g", list(val), envir = myenv) # 81
do.call(g, list(quote(val)), envir = myenv) # 5
do.call("g", list(quote(val)), envir = myenv) # 100
(function(fun, env){
print(do.call(g, list(val), envir = env)) # 4.5
print(do.call("g", list(val), envir = env)) # 81
print(do.call(g, list(quote(val)), envir = env)) # 5
print(do.call("g", list(quote(val)), envir = env)) # 100
print(do.call(fun, list(val), envir = env)) # 4.5
print(do.call(as.character(substitute(fun)), list(val), envir = env)) # 81
print(do.call(fun, list(quote(val)), envir = env)) # 5
print(do.call(as.character(substitute(fun)), list(quote(val)), envir = env)) # 100
})(g, myenv)
eval(call("g", val)) # 4.5
eval(call("g", quote(val))) # 4.5
eval(call("g", val), envir = env) # 81
eval(call("g", quote(val)), envir = env) # 100
eval(quote(g(val))) # 4.5
eval(quote(g(val)), envir = env) # 100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment