Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用普通编程代码和不使用R函数转换此函数_R - Fatal编程技术网

使用普通编程代码和不使用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)

我在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) & 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)
}