There's probably a better way to do this but I think this will generate what you want:
nsplit = function(X,n){
p = X/sum(X)
diff(round(n*cumsum(c(0,p))))
}
where X
is a vector of sizes and n
in the total. Example:
> nsplit(c(1,2,3,4,5),123)
[1] 8 17 24 33 41
Those numbers sum to 123 and are approximately in the ratio 1:2:3:4:5. See also this:
> nsplit(c(1,2,3,4,5),10*sum(1:5))
[1] 10 20 30 40 50
Note if any of the ratios are small or n
is small then you will get zeroes:
> nsplit(c(1,2,3,4,50),20)
[1] 0 1 1 1 17
I think you can then feed those numbers into spsample
to generate points, but you'll have to do it one polygon feature at a time since spsample
will only handle a single n
argument.