% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/call.R
\name{call2}
\alias{call2}
\title{Create a call}
\usage{
call2(.fn, ..., .ns = NULL)
}
\arguments{
\item{.fn}{Function to call. Must be a callable object: a string,
symbol, call, or a function.}
\item{...}{<\link[=dyn-dots]{dynamic}> Arguments for the function
call. Empty arguments are preserved.}
\item{.ns}{Namespace with which to prefix \code{.fn}. Must be a string
or symbol.}
}
\description{
Quoted function calls are one of the two types of
\link[=is_symbolic]{symbolic} objects in R. They represent the action of
calling a function, possibly with arguments. There are two ways of
creating a quoted call:
\itemize{
\item By \link[=nse-defuse]{quoting} it. Quoting prevents functions from being
called. Instead, you get the description of the function call as
an R object. That is, a quoted function call.
\item By constructing it with \code{\link[base:call]{base::call()}}, \code{\link[base:call]{base::as.call()}}, or
\code{call2()}. In this case, you pass the call elements (the function
to call and the arguments to call it with) separately.
}
See section below for the difference between \code{call2()} and the base
constructors.
}
\section{Difference with base constructors}{
\code{call2()} is more flexible than \code{base::call()}:
\itemize{
\item The function to call can be a string or a \link[=is_callable]{callable}
object: a symbol, another call (e.g. a \code{$} or \code{[[} call), or a
function to inline. \code{base::call()} only supports strings and you
need to use \code{base::as.call()} to construct a call with a callable
object.
\if{html}{\out{
}}\preformatted{call2(list, 1, 2)
as.call(list(list, 1, 2))
}\if{html}{\out{
}}
\item The \code{.ns} argument is convenient for creating namespaced calls.
\if{html}{\out{}}\preformatted{call2("list", 1, 2, .ns = "base")
# Equivalent to
ns_call <- call("::", as.symbol("list"), as.symbol("base"))
as.call(list(ns_call, 1, 2))
}\if{html}{\out{
}}
\item \code{call2()} has \link[=list2]{dynamic dots} support. You can splice lists
of arguments with \verb{!!!} or unquote an argument name with glue
syntax.
\if{html}{\out{}}\preformatted{args <- list(na.rm = TRUE, trim = 0)
call2("mean", 1:10, !!!args)
# Equivalent to
as.call(c(list(as.symbol("mean"), 1:10), args))
}\if{html}{\out{
}}
}
}
\section{Caveats of inlining objects in calls}{
\code{call2()} makes it possible to inline objects in calls, both in
function and argument positions. Inlining an object or a function
has the advantage that the correct object is used in all
environments. If all components of the code are inlined, you can
even evaluate in the \link[=empty_env]{empty environment}.
However inlining also has drawbacks. It can cause issues with NSE
functions that expect symbolic arguments. The objects may also leak
in representations of the call stack, such as \code{\link[=traceback]{traceback()}}.
}
\examples{
# fn can either be a string, a symbol or a call
call2("f", a = 1)
call2(quote(f), a = 1)
call2(quote(f()), a = 1)
#' Can supply arguments individually or in a list
call2(quote(f), a = 1, b = 2)
call2(quote(f), !!!list(a = 1, b = 2))
# Creating namespaced calls is easy:
call2("fun", arg = quote(baz), .ns = "mypkg")
# Empty arguments are preserved:
call2("[", quote(x), , drop = )
}
\seealso{
call_modify
}