Почему l oop не работает? если & C функция - PullRequest
1 голос
/ 08 марта 2020
data_base<- c("www.url1.com","www.url2.com","www.url3.com")
data1<-c("www.url4.com","www.url5.com","www.url2.com")

lapply(data1,function(x){if(is.element(x, data_base)==F){
                               data_base<-c(data_base,x)}else{NULL}})

Я хочу проверить каждый элемент в векторе «data1» и, если он не соответствует ни одному из тех, которые уже существуют в «data_base», добавить его в «data_base». Он не добавляется, даже хотя условие верно.

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Лучший способ сделать это:

data_base <- union( data_base , data1 )

так

data_base<- c("www.url1.com","www.url2.com","www.url3.com")
data1<-c("www.url4.com","www.url5.com","www.url2.com")

data_base <- union(data_base, data1)

> data_base
[1] "www.url1.com" "www.url2.com" "www.url3.com" "www.url4.com" "www.url5.com"

Но чтобы напрямую ответить на ваш вопрос, вы обновляете data_base только в среде, созданной функция в lapply. Вам нужно будет вернуть его или назначить его с помощью <<- (но не делайте этого), чтобы получить ожидаемое поведение.

0 голосов
/ 09 марта 2020
  • Если вы хотите использовать циклы, вы можете попробовать for l oop, как показано ниже
for (x in data1) {
  if (!is.element(x,data_base)) {
    data_base <- c(data_base,x)
  }
}
  • Если вы хотите использовать *apply функции , вы можете попробовать sapply
data_base <- na.omit(c(data_base,sapply(data1,function(x) ifelse(!is.element(x, data_base),x,NA),USE.NAMES = FALSE)))

Оба решения дадут вам

> data_base
[1] "www.url1.com" "www.url2.com" "www.url3.com"
[4] "www.url4.com" "www.url5.com"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...