Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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.为什么我的函数忽略1(并正确处理任何数字)?_R_Function - Fatal编程技术网

R.为什么我的函数忽略1(并正确处理任何数字)?

R.为什么我的函数忽略1(并正确处理任何数字)?,r,function,R,Function,该函数需要计数和使用频率(输入向量、输出矩阵)。(我知道,我如何能做得更容易,但我想了解错误)。 问题是函数忽略了向量中的1 count_elements <- function(x) { y <- sort(x) m <- matrix(, nrow = 2, ncol = length(unique(x))) a <- 1 for (i in 1:length(sort(x))) { if(is.element(y[i], m)) { } else {

该函数需要计数和使用频率(输入向量、输出矩阵)。(我知道,我如何能做得更容易,但我想了解错误)。 问题是函数忽略了向量中的1

count_elements <- function(x) {

y <- sort(x)
m <- matrix(, nrow = 2, ncol = length(unique(x)))
a <- 1
for (i in 1:length(sort(x))) {
  if(is.element(y[i], m))  {
  } else { 
    (m[1, a] <- y[i]) & (m[2, a] <- sum(y == y[i])) & (a <- a+1) }
  } 
m
}

count\u elements问题在于逻辑
if
测试。您询问“是否
y[i]
m
的元素?”这将检查
m
的第一行和第二行。因此,使用第二个示例
x
,当您完成两次循环时,
m
如下所示:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]   -1    0   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
[2,]    1    1   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA
在循环的下一次迭代中,
if
为真,因为第二行中有一个1。请注意,您刚刚碰巧发现1的错误,但是任何正数都可能出现相同的错误。例如,如果
x=c(1,1,2,3)
您将得到2的错误,因为当您到达循环中的2时,您已经找到了两个1

我认为最简单的解决方法是将
if
语句更改为:

if(is.element(y[i], m[1,]))

关于它们的价值,还有一些其他的编码思想:

  • length(sort(x))
    length(x)
    相同。不知道你为什么需要“排序”
  • 如果
    if
    语句的计算结果为TRUE,则不会发生任何事情,因此似乎不需要任何if/else业务
  • 我从未见过这种括号和符号的编码风格,例如:
    ()&()&()
    。换行符或分号是R中分隔命令的典型方式
  • 尽管您提到您有意以艰难的方式完成此操作,但值得注意的是,
    table(x)
    将以更少的时间和更少的错误完成完全相同的操作:)

您正在
逻辑表达式中执行作业。
操作符的意思是
,它通常不用于像您现在这样将表达式绑定在一起

通过仅对
x
的唯一元素建立索引,可以简化代码。这消除了
a
和检查是否包含元素的需要,而这正是问题的根源所在

count_elements_new <- function(x) {

  y <- sort(x)
  u <- unique(y)
  m <- matrix(, nrow = 2, ncol = length(u))
  for (i in 1:length(u)) {
    m[1, i] <- u[i]
    m[2, i] <- sum(y == u[i])
  }
  m
}
count\u elements\u new
if(is.element(y[i], m[1,]))
count_elements_new <- function(x) {

  y <- sort(x)
  u <- unique(y)
  m <- matrix(, nrow = 2, ncol = length(u))
  for (i in 1:length(u)) {
    m[1, i] <- u[i]
    m[2, i] <- sum(y == u[i])
  }
  m
}