The zample()
function duplicates the functionality of sample()
, with the
exception that it does not attempt the (sometimes dangerous)
user-friendliness of switching the interpretation of the first element to a
number if the length of the vector is 1. zample()
always treats its first
argument as a vector containing elements that should be sampled, so your code
won't break in unexpected ways when the input vector happens to be of length
1.
Usage
zample(x, size = length(x), replace = FALSE, prob = NULL)
Arguments
- x
The vector to sample from
- size
The number of elements to sample from
x
(defaults tolength(x)
)- replace
Should elements be replaced after sampling (defaults to
false
)- prob
A vector of probability weights (defaults to equal probabilities)
Details
If what you really want is to sample from an interval between 1 and n, you can
use sample(n)
or sample.int(n)
(but make sure to only pass vectors of
length one to those functions).
Examples
# For vectors of length 2 or more, zample() and sample() are identical
set.seed(42); zample(7:11)
#> [1] 7 11 10 9 8
set.seed(42); sample(7:11)
#> [1] 7 11 10 9 8
# For vectors of length 1, zample() will still sample from the vector,
# whereas sample() will "magically" switch to interpreting the input
# as a number n, and sampling from the vector 1:n.
set.seed(42); zample(7)
#> [1] 7
set.seed(42); sample(7)
#> [1] 1 5 7 6 2 3 4
# The other arguments work in the same way as for sample()
set.seed(42); zample(7:11, size=13, replace=TRUE, prob=(5:1)^3)
#> [1] 9 9 7 8 8 7 8 7 8 8 7 8 9
set.seed(42); sample(7:11, size=13, replace=TRUE, prob=(5:1)^3)
#> [1] 9 9 7 8 8 7 8 7 8 8 7 8 9
# Of course, sampling more than the available elements without
# setting replace=TRUE will result in an error
set.seed(42); tryCatch(zample(7, size=2), error=wrap_error)
#> #E> cannot take a sample larger than the population
#> #E> when 'replace = FALSE'