Update: I have come to believe that this answer is incorrect. My embolden concern below appears correct, voiding a key part of this answer. For a proper answer, see my other answer.
Following Henrik's lead from the comments, we can give an answer. MoreArgs is best used for the arguments that you want to recycle, but not in the way that Mapply wants to. This is typically the case when said argument is a vector or list. What follows is an extended example.
Consider the rmultinom function. It's very badly behaved. It takes 3 arguments: n controlling how many samples to take, size controlling how big each sample is, and the vector of probabilities prob, where each probability in the vector can be seen as the chance that a biased die of length(prob) sides rolls the face corresponding to the entry in prob in question. Its output is a vector showing the number of times that the biased die landed on each side. For example, this is one possible input and output (read from top to bottom, not left to right):
rmultinom(3,10,c(0.6,0.3,0.1))
[,1] [,2] [,3]
[1,] 6 6 6
[2,] 2 2 4
[3,] 2 2 0
Why do I say that rmultinom is badly behaved? Because this is also valid:
rmultinom(3,10,c(0.6))
[,1] [,2] [,3]
[1,] 10 10 10
You'd think that giving rmultinom a vector of probabilities that don't sum to 1 would throw an error, but for technical reasons that I don't claim to understand, it doesn't.
So let's get back to mapply. Suppose that I want to test with n as 3, 4, and 5 with a sample of size 10 for the first test, 11 for the second test, and 12 for the last. I want prob to stay fixed at c(0.6,0.3,0.1). If I get that last bit wrong, then we'll get the bad behavior that we had earlier.
Let's start by trying mapply(rmultinom,3:5,10:12,c(0.6,0.3,0.1)):
mapply(rmultinom,3:5,10:12,c(0.6,0.3,0.1))
[[1]]
[,1] [,2] [,3]
[1,] 10 10 10
[[2]]
[,1] [,2] [,3] [,4]
[1,] 11 11 11 11
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 12 12 12 12 12
That didn't work. I can tell you that using list(0.6,0.3,0.1) as our last argument doesn't work either. It gives exactly the same output, so I won't even shown it. How about forgetting about c or list and just using 0.6,0.3,0.1 directly?
mapply(rmultinom,3:5,10:12,0.6,0.3,0.1)
Error in (function (n, size, prob) :
unused arguments (dots[[4]][[1]], dots[[5]][[1]])
No luck there. Because of the way that rmultinom works, I can't tell if the vector recycling rule or mapply have betrayed us, but I cannot think of any sensible ways to use the recycling rule that we have not already tried. So how about using MoreArgs with our original vector?
Error in mapply(rmultinom, 3:5, 10:12, MoreArgs = c(0.6, 0.3, 0.1)) :
argument 'MoreArgs' of 'mapply' is not a list
Alright then, we'll have to use a list...
mapply(rmultinom,3:5,10:12,MoreArgs=list(0.6,0.3,0.1))
Error in (function (n, size, prob) : unused arguments (0.3, 0.1)
A list of our vector then!
> mapply(rmultinom,3:5,10:12,MoreArgs=list(c(0.6,0.3,0.1)))
[[1]]
[,1] [,2] [,3]
[1,] 4 8 9
[2,] 3 1 0
[3,] 3 1 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] 6 8 4 7
[2,] 4 3 7 3
[3,] 1 0 0 1
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 7 6 9 8 7
[2,] 2 2 3 3 4
[3,] 3 4 0 1 1
And now we finally have something that works. Incidentally, mapply(rmultinom,3:5,10:12,list(c(0.6,0.3,0.1))) also works, but I think that's because mapply knows to pass list(c(0.6,0.3,0.1)) as MoreArgs=list(c(0.6,0.3,0.1)). I'd be interested to know if anyone can confirm that. It could be the case that mapply is recycling the first entry of list(c(0.6,0.3,0.1)), which would be the vector c(0.6,0.3,0.1), rendering this entire answer false.
Assuming that the above isn't a case of recycling, then we can confidently say that we couldn't find a vector recycling way to do what we wanted to, which therefore answers the question and shows that we needed MoreArgs. But as a bonus, it's worth showing how to do this with anonymous functions:
mapply(function(x,y,z) rmultinom(x,y,c(0.6,0.3,0.1)),3:5,10:12)
[[1]]
[,1] [,2] [,3]
[1,] 5 7 4
[2,] 4 2 5
[3,] 1 1 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] 5 7 5 5
[2,] 5 1 5 4
[3,] 1 3 1 2
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 10 8 8 8 8
[2,] 2 2 3 3 3
[3,] 0 2 1 1 1
Personally, the anonymous functions way to do it seems a lot more natural, but I suppose that it might get a bit ugly if you have a few too many arguments. mapply(function(...,z) rmultinom(...,c(0.6,0.3,0.1)),3:5,10:12) and mapply(function(...) rmultinom(...,c(0.6,0.3,0.1)),3:5,10:12) also work, but I have no idea if they're safe or idiomatic.