# What's the most economical way to fill a matrix with random values?

I'm trying to find the most economical and elegant code for a simple task: fill an empty matrix with randomly sampled values (here, A, B, or C). For illustration, let's take this matrix:

``````x <- matrix(NA, nrow=8, ncol=4)
[,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA
[4,]   NA   NA   NA   NA
[5,]   NA   NA   NA   NA
[6,]   NA   NA   NA   NA
[7,]   NA   NA   NA   NA
[8,]   NA   NA   NA   NA
``````

To fill it I've used two codes so far, each successfully doing the job. The first uses `sapply`:

``````x[] <- sapply(x, function(i) sample(LETTERS[1:3], 1, replace = F))
x
[,1] [,2] [,3] [,4]
[1,] "C"  "A"  "B"  "C"
[2,] "B"  "B"  "B"  "B"
[3,] "A"  "B"  "B"  "B"
[4,] "B"  "C"  "A"  "C"
[5,] "B"  "A"  "C"  "A"
[6,] "A"  "B"  "C"  "A"
[7,] "A"  "C"  "C"  "A"
[8,] "C"  "B"  "B"  "C"
``````

while the second is a `for`loop:

``````for(i in 1:nrow(x)){
x[i,] <- sample(LETTERS[1:3], 4, replace = T)
}
x
[,1] [,2] [,3] [,4]
[1,] "C"  "A"  "C"  "C"
[2,] "C"  "A"  "B"  "B"
[3,] "C"  "C"  "A"  "B"
[4,] "C"  "C"  "A"  "C"
[5,] "A"  "C"  "C"  "C"
[6,] "B"  "C"  "A"  "A"
[7,] "C"  "C"  "B"  "A"
[8,] "B"  "C"  "B"  "C"
``````

I like neither of them as they both look bulky. Is there a better way to get the expected result, that is, is there a shorter and/or more elegant way?