Используйте соответствующий тип NA
напрямую:
NA_vec3 = function(mode, length) {
mode = match.arg(mode, choices = c("numeric", "integer", "complex", "logical", "character"))
if (mode == "numeric") return(rep(NA_real_, length))
if (mode == "integer") return(rep(NA_integer_, length))
if (mode == "complex") return(rep(NA_complex_, length))
if (mode == "character") return(rep(NA_character_, length))
rep(NA, length)
}
n = 1e5
microbenchmark::microbenchmark(
Gregor = NA_vec3("numeric", n),
G5W = NA_vec2("numeric", n),
OP = NA_vec("numeric", n)
)
# Unit: microseconds
# expr min lq mean median uq max neval
# Gregor 210.160 224.4410 343.2125 244.5395 271.3385 7749.094 100
# G5W 644.583 670.8525 1280.5191 683.7235 705.5860 11864.828 100
# OP 995.436 1021.7055 2020.2795 1051.8545 1346.6415 12450.877 100
Для исторического интереса этот ответ был удален:
NA_vec2<-function(vec_mode, vec_length) {
vec<-vector(mode=vec_mode, length=vec_length)
vec<-replace(vec, 1:vec_length, NA)
}
Как еще одна идея, я тоже попробовал это, но это было даже медленнее, чем оригинал, поэтому я пропустил это.
# slowest yet
NA_vec4 = function(mode, length) {
x = rep(NA, length)
storage.mode(x) = mode
x
}