loại bỏ tất cả các biến ngoại trừ các hàm


113

Tôi đã tải trong bảng điều khiển R loại đối tượng khác nhau. Tôi có thể xóa tất cả chúng bằng cách sử dụng

rm(list=ls())

hoặc chỉ xóa các hàm (chứ không phải các biến) bằng cách sử dụng

rm(list=lsf.str())

Câu hỏi của tôi là: có cách nào để loại bỏ tất cả các biến ngoại trừ các hàm

Câu trả lời:


137

Đây là một lớp lót loại bỏ tất cả các đối tượng ngoại trừ các hàm:

rm(list = setdiff(ls(), lsf.str()))

Nó sử dụng setdiffđể tìm tập hợp con của các đối tượng trong môi trường toàn cục (được trả về bởi ls()) không có chế độ function(được trả về bởi lsf.str())


5
Nếu bạn cũng muốn loại bỏ đối tượng có tên bắt đầu bằng một giai đoạn, sử dụng này thay vì: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien

1
Cảm ơn rất nhiều cho câu trả lời này. Tôi có thể biết kinh nguyệt là gì không?
RockScience

1
Chắc chắn rồi. Một giai đoạn (bằng tiếng Anh Mỹ) là một tên khác cho một dấu chấm, như thế này: .Để xem những gì tôi đang nói về, hãy thử.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

tuyệt vời cảm ơn bạn. Tôi đã nhận thấy rằng .j không bị ảnh hưởng bởi ls () nhưng có thể giải thích điều đó.
RockScience

7

setdiffCâu trả lời được đăng là tốt đẹp. Tôi chỉ nghĩ rằng tôi sẽ đăng chức năng liên quan này mà tôi đã viết một thời gian trước. Tính hữu ích của nó là tùy thuộc vào người đọc :-).

lstype<-function(type='closure'){ 
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
}

1
Cảm ơn vì đã đăng điều đó. ls.str()Tuy nhiên, nó tạo ra một sự so sánh thú vị với mã mà nó kiểm tra modechứ không phải typeofđối tượng. (Một lưu ý nhỏ, tôi sẽ rất ngạc nhiên nếu tôi có thể tìm ra sự khác biệt giữa hai thứ đó từ tài liệu của họ).
Josh O'Brien

Tôi luôn luôn sử dụng lớp thay vì typeof
RockScience

1

Bạn có thể sử dụng lệnh sau để xóa TẤT CẢ các biến. Hãy cẩn thận vì bạn không thể lấy lại các biến của mình.

rm(list=ls(all=TRUE))

1
Thông tin cần biết nhưng đó không phải là không phải là câu hỏi
RockScience

Tôi đoán lẽ ra tôi nên để lại điều đó như một bình luận vì nó mang tính chất FYI hơn. Lấy làm tiếc.
lwileczek

0

Đây là một chức năng khá tiện lợi mà tôi đã nhặt được ở đâu đó và điều chỉnh một chút. Có thể được tốt để giữ trong danh bạ.

list.objects <- function(env = .GlobalEnv) 
{
    if(!is.environment(env)){
        env <- deparse(substitute(env))
        stop(sprintf('"%s" must be an environment', env))
    }
    obj.type <- function(x) class(get(x, envir = env))
    foo <- sapply(ls(envir = env), obj.type)
    object.name <- names(foo)
    names(foo) <- seq(length(foo))
    dd <- data.frame(CLASS = foo, OBJECT = object.name, 
                     stringsAsFactors = FALSE)
    dd[order(dd$CLASS),]
}

> x <- 1:5
> d <- data.frame(x)
> list.objects()
#        CLASS       OBJECT
# 1 data.frame            d
# 2   function list.objects
# 3    integer            x 
> list.objects(env = x)
# Error in list.objects(env = x) : "x" must be an environment

0

Tôi đã viết điều này để xóa tất cả các đối tượng ngoài các hàm khỏi môi trường hiện tại (Ngôn ngữ lập trình được sử dụng là R với IDE R-Studio):

    remove_list=c()                             # create a vector

      for(i in 1:NROW(ls())){                   # repeat over all objects in environment
        if(class(get(ls()[i]))!="function"){    # if object is *not* a function
         remove_list=c(remove_list,ls()[i])     # ..add to vector remove_list
         }    
      }

    rm(list=remove_list)                        # remove all objects named in remove_list

Ghi chú-

Đối số "list" trong rm (list =) phải là một vector ký tự.

Tên của một đối tượng ở vị trí i của môi trường hiện tại được trả về từ ls () [i] và chính đối tượng đó từ get (ls () [i]). Do đó, lớp của một đối tượng được trả về từ lớp (get (ls () [i]))


Vui lòng bổ sung thêm thông tin về "môi trường hiện tại", ví dụ: đây là trình bao hay ngôn ngữ lập trình nhất định
DiveIntoML
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.