I wrote a wrapper around ftable
because I need to compute flat tables with frequency and percentage for many variables. As ftable
method for class "formula" uses non-standard evaluation, the wrapper relies on do.call
and match.call
to allow the use of the subset
argument of ftable
(more details in my previous question).
mytable <- function(...) {
do.call(what = ftable,
args = as.list(x = match.call()[-1]))
# etc
}
However, I cannot use this wrapper with lapply
nor with
:
# example 1: error with "lapply"
lapply(X = warpbreaks[c("breaks",
"wool",
"tension")],
FUN = mytable,
row.vars = 1)
Error in (function (x, ...) : object 'X' not found
# example 2: error with "with"
with(data = warpbreaks[warpbreaks$tension == "L", ],
expr = mytable(wool))
Error in (function (x, ...) : object 'wool' not found
These errors seem to be due to match.call
not being evaluated in the right environment.
As this question is closely linked to my previous one, here is a sum up of my problems:
- The wrapper with
do.call
andmatch.call
cannot be used withlapply
orwith
. - The wrapper without
do.call
andmatch.call
cannot use thesubset
argument offtable
.
And a sum up of my questions:
- How can I write a wrapper which allows both to use the
subset
argument offtable
and to be used withlapply
andwith
? I have ideas to avoid the use oflapply
andwith
, but I am looking to understand and correct these errors to improve my knowledge of R. - Is the error with
lapply
related to the following note from?lapply
?For historical reasons, the calls created by lapply are unevaluated, and code has been written (e.g., bquote) that relies on this. This means that the recorded call is always of the form FUN(X[[i]], ...), with i replaced by the current (integer or double) index. This is not normally a problem, but it can be if FUN uses sys.call or match.call or if it is a primitive function that makes use of the call. This means that it is often safer to call primitive functions with a wrapper, so that e.g. lapply(ll, function(x) is.numeric(x)) is required to ensure that method dispatch for is.numeric occurs correctly.
mytable
intoftable
? – Aksum