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
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
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ó. –