2015-01-27 15 views
5

Hãy xem xét các vector sau xSử 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.

Trả lời

6

bạn cần một phương pháp format và một phương pháp as.data.frame, như thế này:

x <- c(6e+06, 75000400, 743450000, 340000, 4300000) 
class(x) <- 'million' 
format.million <- function(x,...)paste0(round(unclass(x)/1e6, 1), "M") 
as.data.frame.million <- base:::as.data.frame.factor 
data.frame(x) 
+0

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

+0

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

+1

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

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