A while back I spent a decent amount of time creating some VBA code that would give me the Cartesian product of an arbitrary number of vectors of arbitrary size. Recursion has always been a stumbling block for me so I spent most of my time testing and tweaking the code against arrays I had built in a spreadsheet.
So it should come as no surprise that R does this with a simple, built-in function: expand.grid(). The lesson remains: if you need it, 99 percent of the time someone has already coded it. Granted I was one of the few dolts who just HAD to have this in Excel, so I’m not too upset about my oversight. Code below:
-- First, in R
-- Use the Cartesian product to make sure
-- all the dogs get all the grooming services
a <- c("Saffy","Pickles","Zoe");
b <- c("nails","bath","haircut");
x <- expand.grid(a,b);
-- Now, in VBA
Function crossP(ByVal x As Collection, str As String)
Dim outList As New Collection
Dim words As New Collection
Dim tempx As New Collection
words.Add (x.item(1))
If (x.Count = 1) Then
'.. we have reached the last one so no need to recurse
For i = 1 To words.item(1).Count
outList.Add (str & words.item(1).item(i))
Next i
Else
For i = 1 To words.item(1).Count
For Each cItem In x
tempx.Add cItem
Next cItem
tempx.Remove (1)
For Each cItem In crossP(tempx, str & words.item(1).item(i))
outList.Add cItem
Next cItem
Set tempx = Nothing
Next i
End If
Set crossP = outList
End Function