使用普通编程代码和不使用R函数转换此函数
我在R中有这个函数,来自前面的一个问题使用普通编程代码和不使用R函数转换此函数,r,R,我在R中有这个函数,来自前面的一个问题 shift <- function(d, k) rbind( tail(d,k), head(d,-k), deparse.level = 0 ) shift如果不使用R函数,我不知道你说的是什么意思,因为几乎所有东西都是R函数,但这里有一个解决方案,只使用非常通用的nrow()(矩阵行数),%%(模数)和seq_len(相当于1:length(x)除了效果更好外): 证明他们都是平等的: all(shift(m,5) == shift2(m,5)
shift <- function(d, k) rbind( tail(d,k), head(d,-k), deparse.level = 0 )
shift如果不使用R函数,我不知道你说的是什么意思,因为几乎所有东西都是R函数,但这里有一个解决方案,只使用非常通用的nrow()
(矩阵行数),%%
(模数)和seq_len
(相当于1:length(x)
除了效果更好外):
证明他们都是平等的:
all(shift(m,5) == shift2(m,5) & shift2(m,5) == shift3(m,5))
[1] TRUE
编辑:
实际上,shift3()
shift3 <- function(d, k)
{
out <- matrix(,nrow(d),ncol(d))
sor <- numeric(1)
for (i in seq_len(nrow(d)))
{
if (i-k < 1) sor <- nrow(d)-k+i else sor <- i-k
for (j in seq_len(ncol(d))) out[i,j] <- d[sor,j]
}
return(out)
}
出于好奇而移动3…为什么?for循环在R中通常要慢得多。@digEmAll:我想用多种方式来实现,这就是why@digEmAll-关于R中循环速度的一般性陈述是错误的。如果在循环开始之前创建所需的存储,则它们并不像您的评论所建议的那样效率低下。如果你的意思是取代R中的矢量化操作,我同意你的看法。@GavinSimpson抱歉,但不是;循环将始终比索引或向量化操作慢,因为执行R代码的成本与本机代码相比非常高(至少在R引擎中出现JIT之前[-:)。分配在这里也是个问题,但不是唯一的问题。@mbq-我不是这么说的吗?请看我评论的最后一行。我可能误解了@digEmAll评论的意图。我想这取决于他们所说的“慢得多”是什么意思?比什么?循环在R中并不慢-这在S-PLUS中是一个问题。当然,使用循环代替矢量化操作会慢得多。谢谢,老实说,我不理解代码,我如何在java或C中对文本执行循环file@smack:Sacha已经满足了您的要求。如果您希望翻译成Java或C,请在一个新问题中提出这个问题。
all(shift(m,5) == shift2(m,5) & shift2(m,5) == shift3(m,5))
[1] TRUE
shift3 <- function(d, k)
{
out <- matrix(,nrow(d),ncol(d))
sor <- numeric(1)
for (i in seq_len(nrow(d)))
{
if (i-k < 1) sor <- nrow(d)-k+i else sor <- i-k
for (j in seq_len(ncol(d))) out[i,j] <- d[sor,j]
}
return(out)
}