是否有一种优雅的内置方式在R中进行模数索引?

Ana*_*bus 6 indexing r built-in mod

目前,我有

extract_modulo = function(x, n, fn=`[`) fn(x, (n-1L) %% length(x) + 1L)
`%[mod%` = function (x, n) extract_modulo(x, n)
Run Code Online (Sandbox Code Playgroud)

然后:

seq(12) %[mod% 14
#[1] 2
Run Code Online (Sandbox Code Playgroud)

这已经在某个地方内置了吗?我会这么认为,因为R有几个回收价值的功能(例如paste).但是,我不跟结果一无所获help('[['),??index??mod.我认为这样的R符号可能是seq(12)[/14/]或类似的as.list(seq(12))[[/14/]].

De *_*ica 0

rep_len()是一个快速.Internal函数,适合这种用途或在您自己的函数中回收参数时。对于这种特殊情况,当您在超出向量长度的索引位置查找值时,rep_len(x, n)[n]对于任何非负整数 'n' 和任何非 ,将始终执行您正在查找的操作NULL x

rep_len(seq(12), 14)[14]
# [1] 2
rep_len(letters, 125)[125]
# [1] "u"
Run Code Online (Sandbox Code Playgroud)

如果结果证明您不需要回收,那么它在值小于的情况x下也可以正常工作nlength(x)

rep_len(seq(12), 5)[5]
# [1] 5
rep_len(seq(12), 0)[0]
# integer(0)
# as would be expected, there is nothing there
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您当然可以创建一个包装器:

recycle_index <- function(x, n) rep_len(x, n)[n]
recycle_index(seq(12), 14)
# [1] 2
Run Code Online (Sandbox Code Playgroud)