Matrisleri ve vektörleri aralarında rasgele karakter dizeleri (genellikle işleçler) ile basabilen çok basit bir işlev oluşturdum. Farklı sayıda satır içeren matrislere izin verir ve vektörleri sütun matrisleri olarak ele alır. Çok ayrıntılı değil, bu yüzden başarısız olduğu birçok örnek var. Ama sorunuzdaki kadar basit bir örnek için, bu yeterli olmalı. Sayıları karakterlere dönüştürmek için
format()
kullanılır. Bu, matrisin tüm sıralarının aynı genişliğe sahip olması ve böylece basıldığında güzel bir şekilde hizalanması avantajına sahiptir. Gerekirse, yapılandırılabilir yapmak için format()
argümanlarının bir kısmını mat_op_print()
argümanları olarak da ekleyebilirsiniz. Örnek olarak, sütunların minimum genişliğini kontrol etmek için kullanılabilecek width
argümanını ekledim.
Matrisler ve vektörler işlev çağrısında adlarsa, bu adlar ilk satırda başlıklar olarak yazdırılır. Aksi takdirde sadece sayılar yazdırılır.
Yani, bu işlevi:
mat_op_print <- function(..., width = 0) {
# get arguments
args <- list(...)
chars <- sapply(args, is.character)
# auxilliary function to create character of n spaces
spaces <- function(n) paste(rep(" ", n), collapse = "")
# convert vectors to row matrix
vecs <- sapply(args, is.vector)
args[vecs & !chars] <- lapply(args[vecs & !chars], function(v) matrix(v, ncol = 1))
# convert all non-characters to character with format
args[!chars] <- lapply(args[!chars], format, width = width)
# print names as the first line, if present
arg_names <- names(args)
if (!is.null(arg_names)) {
get_title <- function(x, name) {
if (is.matrix(x)) {
paste0(name, spaces(sum(nchar(x[1, ])) + ncol(x) - 1 - nchar(name)))
} else {
spaces(nchar(x))
}
}
cat(mapply(get_title, args, arg_names), "\n")
}
# auxiliary function to create the lines
get_line <- function(x, n) {
if (is.matrix(x)) {
if (nrow(x) < n) {
spaces(sum(nchar(x[1, ])) + ncol(x) - 1)
} else {
paste(x[n, ], collapse = " ")
}
} else if (n == 1) {
x
} else {
spaces(nchar(x))
}
}
# print as many lines as needed for the matrix with most rows
N <- max(sapply(args[!chars], nrow))
for (n in 1:N) {
cat(sapply(args, get_line, n), "\n")
}
}
Ve bu nasıl çalıştığını bir örnek:
A = matrix(c(0.5, 1, 3, 0.75, 2.8, 4), nrow = 2)
x = c(0.5, 3.7, 2.3)
y = c(0.7, -1.2)
b = A %*% x - y
mat_op_print(A = A, " * ", x = x, " - ", y = y, " = ", b = b, width = 6)
## A x y b
## 0.50 3.00 2.80 * 0.5 - 0.7 = 17.090
## 1.00 0.75 4.00 3.7 -1.2 13.675
## 2.3
Ayrıca 3 boyutlu bir dizi yan tarafının dilimleri baskı mümkündür:
A <- array(1:12, dim = c(2, 2, 3))
mat_op_print(A1 = A[, , 1], " | ", A2 = A[, , 2], " | ", A3 = A[, , 3])
## A1 A2 A3
## 1 3 | 5 7 | 9 11
## 2 4 6 8 10 12
yardımcı olabilecek http://stackoverflow.com/questions/27513395/print-method-for-multiple-matrices – user20650