У вас, по сути, есть два вектора, ids
и m
:
> ids
[1] 1 2 3 4 5
> m
[1] 1 3 5 7 10
, и вы по сути выполняете это:
for(i in 1:length(ids)){
for(j in 1:length(m)){
if(i != m[j]){
message("add ",i,j)
}else{
message("Not adding ",i,j)
}
}
}
Запустите это, и вы увидитеон добавляет множество элементов, потому что вы проверяете каждый идентификатор с каждым элементом в m
, и по крайней мере один элемент m
не входит в идентификатор, так что добавляется один (и более).
То, что вам действительно нужно, это:
for(i in 1:length(ids)){
if(!(i %in% m)){
message("add ",i,j)
}else{
message("Not adding ",i,j)
}
}
, который печатает:
Not adding 15
add 25
Not adding 35
add 45
Not adding 55
Добавляет элементы с ID 2 и 4, которые не входят в m
.
В качестве альтернативы используйте базовую функцию R Filter
, которая сокращает список с помощью функции элемента списка:
> Filter(function(L){!(L@data$lineID %in% m)}, sldfl)
[[1]]
class : SpatialLinesDataFrame
features : 1
extent : 0, 13, 0, 1 (xmin, xmax, ymin, ymax)
coord. ref. : NA
variables : 1
names : lineID
value : 2
[[2]]
class : SpatialLinesDataFrame
features : 1
extent : 0, 1, 0, 13 (xmin, xmax, ymin, ymax)
coord. ref. : NA
variables : 1
names : lineID
value : 4