Làm thế nào tôi có thể loại bỏ tất cả các đối tượng trừ một đối tượng khỏi không gian làm việc trong R?


219

Tôi có một không gian làm việc với rất nhiều đối tượng và tôi muốn loại bỏ tất cả trừ một. Lý tưởng nhất là tôi muốn tránh phải gõ rm(obj.1, obj.2... obj.n). Có thể chỉ ra remove all objects but these ones?

Câu trả lời:


373

Đây là một cấu trúc đơn giản sẽ làm điều đó, bằng cách sử dụng setdiff:

rm(list=setdiff(ls(), "x"))

Và một ví dụ đầy đủ. Chạy điều này có nguy cơ của riêng bạn - nó sẽ loại bỏ tất cả các biến ngoại trừ x:

x <- 1
y <- 2
z <- 3
ls()
[1] "x" "y" "z"

rm(list=setdiff(ls(), "x"))

ls()
[1] "x"

8
Kỹ thuật đang được sử dụng ở đây là sử dụng list = to rm, cho phép truyền một vectơ ký tự đến rm thay vì danh sách các tên.
Spainedman

53

Sử dụng keepchức năng từ gdatagói khá tiện lợi.

> ls()
[1] "a" "b" "c"

library(gdata)
> keep(a) #shows you which variables will be removed
[1] "b" "c"
> keep(a, sure = TRUE) # setting sure to TRUE removes variables b and c
> ls()
[1] "a"

Tôi thấy rằng việc sử dụng "keep" từ gdata dường như có ý nghĩa hơn và dễ nhớ hơn rằng tất cả sự phức tạp của tình trạng hôn mê trong căn cứ R.
Darius

47

Tôi nghĩ một tùy chọn khác là mở không gian làm việc trong RStudio và sau đó thay đổi danh sách thành lưới ở phía trên bên phải của môi trường (hình ảnh bên dưới). Sau đó đánh dấu vào các đối tượng bạn muốn xóa và cuối cùng nhấp vào xóa.

nhập mô tả hình ảnh ở đây


3
Tương tự, bấm vào hộp Tên, chọn tất cả các tệp, sau đó bỏ chọn tất cả các tệp bạn muốn giữ.
Stephen

26

Tôi chỉ mất vài giờ để tìm câu trả lời cho một câu hỏi tương tự nhưng hơi khác - tôi cần có thể xóa tất cả các đối tượng trong R (bao gồm các hàm) ngoại trừ một số vectơ.

Một cách để làm điều này:

rm(list=ls()[! ls() %in% c("a","c")])

Trong đó các vectơ mà tôi muốn giữ được đặt tên là 'a' và 'c'.

Hy vọng điều này sẽ giúp bất cứ ai tìm kiếm cùng một giải pháp!


11
Điều này cũng nên làm việc rm(list=setdiff(ls(), c("a", "c"))), phải không? Xem câu trả lời của @ Andrie.
hplieninger

17

Để giữ tất cả các đối tượng có tên khớp với một mẫu, bạn có thể sử dụng grep, như vậy:

to.remove <- ls()
to.remove <- c(to.remove[!grepl("^obj", to.remove)], "to.remove")
rm(list=to.remove)


6

Điều này đem đến ls()'s patterntùy chọn, trong trường hợp bạn có rất nhiều đối tượng với cùng một khuôn mẫu mà bạn không muốn giữ:

> foo1 <- "junk"; foo2 <- "rubbish"; foo3 <- "trash"; x <- "gold"  
> ls()
[1] "foo1" "foo2" "foo3" "x"   
> # Let's check first what we want to remove
> ls(pattern = "foo")
[1] "foo1" "foo2" "foo3"
> rm(list = ls(pattern = "foo"))
> ls()
[1] "x"

Whoah, điều đó có vẻ nguy hiểm! Có cách nào để kiểm tra mô hình khớp với một "tiếng vang" trong vỏ không?
DQdlM

1
Tôi đoán rmchức năng nên luôn luôn được sử dụng một cách cẩn thận (hơn nữa trong phần vỏ!). Xem chỉnh sửa của tôi để có câu trả lời cho câu hỏi của bạn.
Peter Diakumis


3

Hãy nghĩ theo cách khác, nếu chúng ta muốn xóa một nhóm thì sao? thử cái này,

 rm(list=ls()[grep("xxx",ls())]) 

Cá nhân tôi không thích quá nhiều bảng, biến trên màn hình, nhưng tôi không thể tránh sử dụng chúng. Vì vậy, tôi đặt tên cho những thứ tạm thời bắt đầu bằng "xxx", vì vậy tôi có thể loại bỏ chúng sau khi nó không còn được sử dụng.


2

Từ trong một hàm, rm tất cả các đối tượng trong .GlobalEnv ngoại trừ hàm

initialize <- function(country.name) {

  if (length(setdiff(ls(pos = .GlobalEnv), "initialize")) > 0) {
    rm(list=setdiff(ls(pos = .GlobalEnv), "initialize"), pos = .GlobalEnv)
  }

}

2

Để giữ một danh sách các tập tin, người ta có thể sử dụng:

rm(list=setdiff(ls(), c("df1", "df2")))

1

Còn cái này thì sao?

# Removes all objects except the specified & the function itself.

rme <- function(except=NULL){
  except = ifelse(is.character(except), except, deparse(substitute(except)))
  rm(list=setdiff(ls(envir=.GlobalEnv), c(except,"rme")), envir=.GlobalEnv)
}

1

giả sử bạn muốn xóa mọi đối tượng ngoại trừ df khỏi môi trường:

rm(list = ls(pattern="[^df]"))

1
# remove all objects but selected
rm(list = ls()[which("key_function" != ls())])

-9

Sau đây sẽ xóa tất cả các đối tượng khỏi bảng điều khiển của bạn

rm(list = ls())

4
Trước hết, đây không phải là những gì được yêu cầu. Thứ hai, về mọi cách có thể làm điều đó trong R đã được đề cập trong các câu trả lời trước. Bạn rất sẵn lòng giúp đỡ những người dùng khác có câu hỏi mới. Điều này đã được giải quyết 6 năm trước, và giải pháp đó vẫn còn tồn tại đến ngày nay.
Joris Meys
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.