Hãy xem xét các vector sau x
Sử dụng phương pháp in của một véc tơ trong một khung dữ liệu
x <- c(6e+06, 75000400, 743450000, 340000, 4300000)
Tôi muốn in x
trong hàng triệu, vì vậy tôi đã viết một phương pháp in và gán một lớp học để x
print.million <- function(x, ...) {
x <- paste0(round(x/1e6, 1), "M")
NextMethod(x, quote = FALSE, ...)
}
class(x) <- "million"
Vì vậy, bây giờ x
sẽ in như thế nào tôi muốn, với các giá trị số cũng còn nguyên vẹn.
x
# [1] 6M 75M 743.5M 0.3M 4.3M
unclass(x)
# [1] 6000000 75000400 743450000 340000 4300000
Đây là vấn đề tôi muốn giải quyết. Khi tôi đặt x
vào khung dữ liệu, phương thức in không còn áp dụng và các giá trị số x
được in bình thường.
(df <- data.frame(x = I(x)))
# x
# 1 6e+06
# 2 75000400
# 3 743450000
# 4 340000
# 5 4300000
Lớp học của x
vẫn là lớp "triệu", chắc chắn là những gì tôi muốn.
df$x
# [1] 6M 75M 743.5M 0.3M 4.3M
class(df$x)
# [1] "AsIs" "million"
Làm thế nào tôi có thể đặt x
vào một khung dữ liệu và cũng duy trì phương pháp in của nó? Tôi đã thử tất cả các đối số để data.frame()
và không thực sự biết nơi để chuyển tiếp theo.
Kết quả mong muốn là khung dữ liệu bên dưới, trong đó x
vẫn là lớp "triệu", nó duy trì các giá trị số cơ bản của nó và cũng in trong khung dữ liệu như khi nó được in trong bảng điều khiển.
# x
# 1 6M
# 2 75M
# 3 743.5M
# 4 0.3M
# 5 4.3M
Lưu ý: Câu hỏi này liên quan đến phần thứ hai của an answer I posted earlier.
nó vẫn là một vector số. thử 'unclass (df $ x)' hoặc 'df $ x + 10^6'. (lưu ý rằng tôi đã sửa đổi chức năng) – Jthorpe
Tôi không gọi 'df <- data.frame (x = format (x))'. nó chỉ là print.data.frame' gọi phương thức 'format' để xác định cách in data.frame vào giao diện điều khiển – Jthorpe
nếu bạn đọc' as.data.frame.factor' nó không dựa vào bất kỳ thuộc tính nào của các yếu tố, và nó sẽ chăm sóc của tất cả mọi thứ bạn cần để tạo ra một đối tượng data.frame từ một vector. – Jthorpe