【问题标题】:Can someone explain what they are doing at the sum part of this question有人可以在这个问题的总和部分解释他们在做什么吗
【发布时间】:2020-04-06 14:43:06
【问题描述】:

正在网上查看一些问题,这就是问题

创建唯一的函数,它给定一个向量将返回一个新向量,其中第一个向量的元素已删除重复元素。

我查看了解决方案,这就是他们所拥有的

f.uniq <- function (v) {
  s <- c()

  for(i in 1:length(v)) {
    if(sum(v[i] == s) == 0) {
      s <- c(s, v[i])
    }
  }
  s
}
f.uniq(c(9, 9, 1, 1, 1, 0))

如果有人能解释这里发生了什么

if(sum(v[i] == s) == 0)

【问题讨论】:

  • 这可能有助于将其逐个分解:v[i] == s 是做什么的? sum(v[i] == s) 是做什么的? sum(v[i] == s) == 0 是做什么的?
  • 向量 v 中位置 i 的元素出现在向量 s 中的次数。循环将向量 v 中的值一一追加到空向量 s 中,直到找到重复项
  • 我了解v[I] == s,我有点了解sum,但== 0我无法掌握
  • 您只想附加向量中尚不存在的值。因此,为了附加一个数字,等于您在当前循环迭代中检查的数量值必须为 0。

标签: r function for-loop vector


【解决方案1】:

sum(v[i] == s) == 0 表示v[i] 不在s 中的情况。这里,v[i] == s 产生一个与s 相同维度的逻辑向量,所以sum(v[i] == s) 计算那里的TRUEs 的数量。如果没有TRUEsum(v[i] == s) == 0,则可以输入if语句。

【讨论】:

  • 注意any(v[i] == s) 是表达相同概念的更简洁的方式可能会有所帮助
【解决方案2】:

代码v[i] == sv[i]s 的所有元素之间执行逐元素比较。例如,v[i] == s 返回一个类似 TRUE TRUE FALSE 的列表。如果这个和大于 0,这意味着元素 v[i] 已经包含在列表中。否则,它被附加。

【讨论】:

  • 欢迎堆栈溢出,感谢您的回答。随意添加一些输出结果以准确显示您的意思。例如,在原始帖子的示例中从来没有TRUE TRUE FALSE
【解决方案3】:

一些cat可能在这种情况下有用

f.uniq <- function (v) {
  s <- c()

  for(i in 1:length(v)) {
      cat("\ni=",i,"\nv[i] ==s :", v[i] == s,"\nsum(v[i] == s):",sum(v[i] == s),"\n")
    if(sum(v[i] == s) == 0) {
      s <- c(s, v[i])
    }
  }
  s
}

## > f.uniq(c(9, 9, 1, 1, 1, 0))

## i= 1 
## v[i] ==s :  
## sum(v[i] == s): 0 

## i= 2 
## v[i] ==s : TRUE 
## sum(v[i] == s): 1 

## i= 3 
## v[i] ==s : FALSE 
## sum(v[i] == s): 0 

## i= 4 
## v[i] ==s : FALSE TRUE 
## sum(v[i] == s): 1 

## i= 5 
## v[i] ==s : FALSE TRUE 
## sum(v[i] == s): 1 

## i= 6 
## v[i] ==s : FALSE FALSE 
## sum(v[i] == s): 0 
## [1] 9 1 0

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2012-10-26
    • 2020-05-02
    • 2021-04-07
    • 2010-12-17
    • 2019-04-18
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多