Может ли кто-то объяснить, что они делают в сумме части этого вопроса - PullRequest
0 голосов
/ 06 апреля 2020

Просматривал некоторые вопросы в Интернете, и это был вопрос

Создайте уникальную функцию, которая для данного вектора вернет новый вектор с элементами первого вектора с удаленными дублирующимися элементами.

Я посмотрел на решение, и это то, что у них было

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)

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

sum(v[i] == s) == 0 указывает на то, что v[i] не в s. Здесь v[i] == s дает логический c вектор того же измерения, что и s, поэтому sum(v[i] == s) считает количество TRUE s там. Если нет TRUE, т. Е. sum(v[i] == s) == 0, вы можете ввести оператор if.

1 голос
/ 06 апреля 2020

Код v[i] == s Выполняет поэлементное сравнение между v[i] и всеми элементами s. v[i] == s возвращает список, например TRUE TRUE FALSE. Если сумма этого значения больше 0, это означает, что элемент v[i] уже содержится в списке. В противном случае он добавляется.

0 голосов
/ 06 апреля 2020

Некоторые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...