2010-08-12 25 views
7

Làm thế nào một người có thể là dput() đối tượng S4? Tôi đã thử điều nàydputting đối tượng S4

require(sp) 
require(splancs) 
plot(0, 0, xlim = c(-100, 100), ylim = c(-100, 100)) 
poly.d <- getpoly() #draw a pretty polygon - PRETTY! 
poly.d <- rbind(poly.d, poly.d[1,]) # close the polygon because of Polygons() and its kin 
poly.d <- SpatialPolygons(list(Polygons(list(Polygon(poly.d)), ID = 1))) 
poly.d 
dput(poly.d) 

Lưu ý rằng nếu tôi dput() đối tượng S4, tôi không thể tái tạo lại nó. Suy nghĩ của bạn?

+1

Tại sao bạn muốn xây dựng đối tượng theo cách này? Dường như nó sẽ ít dễ đọc hơn viết một hàm để xây dựng và trả về một đối tượng mẫu mà bạn có thể điều chỉnh. – Vince

+0

Nó chỉ là một chút gì đó tôi nhận thấy khi tôi cố gắng để tiết kiệm một đa giác nhỏ cho mục đích thử nghiệm. Tôi đồng ý rằng nó dễ dàng hơn để có một ma trận n * 2 và một chức năng mà một chút tung hứng trên nó. –

Trả lời

9

Vì nó hiện đang đứng, bạn không thể dput đối tượng này. Mã của dput chứa vòng lặp sau:

if (isS4(x)) { 
    cat("new(\"", class(x), "\"\n", file = file, sep = "") 
    for (n in slotNames(x)) { 
     cat(" ,", n, "= ", file = file) 
     dput(slot(x, n), file = file, control = control) 
    } 
    cat(")\n", file = file) 
    invisible() 
} 

này xử lý S4 đối tượng một cách đệ quy, nhưng nó dựa trên giả định một đối tượng S3 sẽ không chứa một đối tượng S4, mà trong ví dụ của bạn không giữ:

> isS4(slot(poly.d,'polygons')) 
[1] FALSE 
> isS4(slot(poly.d,'polygons')[[1]]) 
[1] TRUE 

Chỉnh sửa: Đây là giới hạn công việc xung quanh dput. Nó hoạt động cho ví dụ bạn cung cấp, nhưng tôi không nghĩ rằng nó sẽ làm việc nói chung (ví dụ: nó không xử lý các thuộc tính).

dput2 <- function (x, 
        file = "", 
        control = c("keepNA", "keepInteger", "showAttributes")){ 
    if (is.character(file)) 
     if (nzchar(file)) { 
      file <- file(file, "wt") 
      on.exit(close(file)) 
     } 
     else file <- stdout() 
    opts <- .deparseOpts(control) 
    if (isS4(x)) { 
     cat("new(\"", class(x), "\"\n", file = file, sep = "") 
     for (n in slotNames(x)) { 
      cat(" ,", n, "= ", file = file) 
      dput2(slot(x, n), file = file, control = control) 
     } 
     cat(")\n", file = file) 
     invisible() 
    } else if(length(grep('@',capture.output(str(x)))) > 0){ 
     if(is.list(x)){ 
     cat("list(\n", file = file, sep = "") 
     for (i in 1:length(x)) { 
      if(!is.null(names(x))){ 
      n <- names(x)[i] 
      if(n != ''){ 
       cat(" ,", n, "= ", file = file) 
      } 
      } 
      dput2(x[[i]], file = file, control = control) 
     } 
     cat(")\n", file = file) 
     invisible() 
     } else { 
     stop('S4 objects are only handled if they are contained within an S4 object or a list object') 
     } 
    } 
    else .Internal(dput(x, file, opts)) 
} 

Và ở đây nó là trong hành động:

> dput2(poly.d,file=(tempFile <- tempfile())) 
> poly.d2 <- dget(tempFile) 
> all.equal(poly.d,poly.d2) 
[1] TRUE 
+0

Rất hữu ích cho tôi! Cảm ơn. Một sửa chữa là cần thiết: thêm dòng này trước khi cuộc gọi đệ quy cuối cùng đến dput2: 'if (i> 1) cat (", ", file = file)' – Roger

Các vấn đề liên quan