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

Posted

技术标签:

【中文标题】是否有一种优雅的内置方法可以在 R 中进行模索引?【英文标题】:Is there an elegant, built-in way to do modulo indexing in R? 【发布时间】:2018-04-08 12:16:14 【问题描述】:

目前,我有

extract_modulo = function(x, n, fn=`[`) fn(x, (n-1L) %% length(x) + 1L)
`%[mod%` = function (x, n) extract_modulo(x, n)

然后:

seq(12) %[mod% 14
#[1] 2

这是否已经内置在 R 的某个地方?我会这么认为,因为 R 有几个回收值的函数(例如,paste)。但是,我没有找到 help('[[')??index??mod 的任何内容。例如,我认为 R 表示法类似于 seq(12)[/14/]as.list(seq(12))[[/14/]]

【问题讨论】:

oarray 包实现了不同偏移量的数组。 我查看了 oarray 包 documentation,但没有找到我正在寻找的模索引功能。也许我忽略了它。 @G.Grothendieck 或其他用户是否愿意指出我忽略了什么? 我的评论是它实现了偏移量。 【参考方案1】:

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

rep_len(seq(12), 14)[14]
# [1] 2
rep_len(letters, 125)[125]
# [1] "u"

如果事实证明您不需要回收 x,它同样适用于小于 length(x)n

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

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

recycle_index <- function(x, n) rep_len(x, n)[n]
recycle_index(seq(12), 14)
# [1] 2

【讨论】:

在使用rep_len 进行模索引时,R 似乎实际上创建了相应的向量,这使得该方法随着相应索引的增加而内存效率越来越低。我想这种技术的变体可能会更快(如果它不经常创建和丢弃索引向量),具体取决于应用程序和机器,因为使用查找而不是模除法。 另外:1) 当为 length.out 参数指定负值时,rep_len 失败,2) 当使用 rep_len 技术时,n = 0 的模索引将失败,因为 @987654337 @ 在length.out == 0 时返回integer(0)

以上是关于是否有一种优雅的内置方法可以在 R 中进行模索引?的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种优雅的 Pythonic 方式来计算已处理的数据? [复制]

是否有一种优雅的方法可以为多租户应用程序克隆具有所有配置(客户端和角色)的 Keycloak 领域?

是否有一种内置方法可以从 PHP 中的多暗淡数组中获取数组?

是否有一种内置方法可以在没有任何查询参数的情况下获取当前 URL?

ListView,是不是有一种简单的方法可以允许在内部拖动项目(内置)?

将字符串与随机颜色 matplotlib 匹配的优雅方式