是否有一种优雅的内置方法可以在 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?