Nice to see William Dunlap take the trouble to mimic the classic Fortran behavior of printing **** for numbers that don't fit in the given width :)

-Michael

On 7/22/19 6:33 p.m., William Dunlap via R-help wrote:
The following mimics Fortran printing with format
<perLine>F<fWidth>.<fPrecision>.

print1 <- function (x, perLine = 10, fWidth = 8, fPrecision = 2,
fortranStars = TRUE)
{
     format <- paste0("%", fWidth, ".", fPrecision, "f")
     oldWidth <- getOption("width")
     on.exit(options(width = oldWidth))
     options(width = perLine * fWidth)
     fx <- sprintf(format, x)
     if (fortranStars) {
         fx[nchar(fx) > fWidth] <- strrep("*", fWidth)
     }
     cat(fx, sep = "", fill = TRUE)
     invisible(x)
}

Compare
print1((-1.7)^(1:24))
    -1.70    2.89   -4.91    8.35  -14.20   24.14  -41.03   69.76 -118.59
  201.60
  -342.72  582.62 -990.46 1683.78-2862.42
4866.12-8272.4014063.08********40642.31
********************************
with the output from the Fortran
% cat a.f
       double precision x(24);
       integer i
       do 10 i=1,24
         x(i) = (-1.7d0) ** i
  10   continue
       write(6, "(10f8.2)") x
       stop
       end
% gfortran a.f
% ./a.out
    -1.70    2.89   -4.91    8.35  -14.20   24.14  -41.03   69.76 -118.59
  201.60
  -342.72  582.62 -990.46 1683.78-2862.42
4866.12-8272.4014063.08********40642.31
********************************


Compare
Bill Dunlap
TIBCO Software
wdunlap tibco.com


On Mon, Jul 22, 2019 at 12:19 AM Rui Barradas <ruipbarra...@sapo.pt> wrote:

Simpler, no loops:


print0b <- function(x, len = 10, digits = 2, fill = ""){
    n <- length(x)
    x <- round(x, digits = digits)
    m <- n %/% len
    remainder <- n %% len
    A <- matrix(x[seq_len(len*m)], ncol = len)
    if(remainder > 0){
      A <- rbind(A, c(x[(len*m + 1):n], rep(fill, len*(m + 1) - n)))
    }
    A
}


Hope this helps,

Rui Barradas

Às 07:47 de 22/07/19, Rui Barradas escreveu:
Hello,

Maybe something like the following is what you want.
I have added an extra argument 'fill' to allow to choose what to print
in the end. It's default value is "" making the entire matrix elements
characters but it can be NA or 0.

print0 <- function(x, len = 10, digits = 2, fill = ""){
    n <- length(x)
    x <- round(x, digits = digits)
    passes <- n %/% len
    remainder <- n %% len
    A <- matrix(fill, nrow = passes + (remainder > 0), ncol = len)
    for(i in seq_len(passes)){
      A[i, ] <- x[(len*(i - 1) + 1):(len*i)]
    }
    A[nrow(A), 1:remainder] <- x[(len*passes + 1):n]
    A
}

print0(rnorm(23), 10)
print0(rnorm(23), 10, fill = 0)


Hope this helps,

Rui Barradas

Às 21:34 de 20/07/19, Steven escreveu:
Dear All:

Below is what I meant. Procedure print0 allows me to print a vector of
length 53 in four rows of 10 plus 1 row of 3 (Ido not like the NA). This
is silly. I am hoping that there is a candid way to print the matrix.
Thank you.

Steven Yen

===
n<-53; x<-runif(n); # x<-round(x,2)

print0<-function(x,c=10,digits=2){
# ******************************************
# Print vector in rows of a specified length
# ******************************************
     n<-length(x)
     r<-n/c; if(n%%c>0) r<-as.integer(r)+1
     y<-rep(NA,r*c)
     y[1:n]<-x
     y<-matrix(y,r,c,byrow=T)
     y<-round(y,digits=digits)
     y
}

print0(x,c=10,digits=3)

# result
# [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
# [1,] 0.576 0.291 0.600 0.515 0.135 0.335 0.296 0.911 0.454 0.696
# [2,] 0.699 0.728 0.442 0.469 0.996 0.539 0.772 0.768 0.652 0.882
# [3,] 0.614 0.228 0.748 0.071 0.788 0.428 0.885 0.722 0.432 0.881
# [4,] 0.422 0.148 0.459 0.870 0.044 0.421 0.282 0.337 0.751 0.579
# [5,] 0.468 0.659 0.446 0.199 0.388 0.576 0.829 0.186 0.823 0.960
# [6,] 0.880 0.944 0.709    NA    NA    NA    NA    NA NA    NA

Steven 於 2019/7/20 下午 02:00 寫道:

Is there a convenient way to print a vector into rows of a specified
column length? What I need is to print in the old FORTRAN format, viz.,

format(10F8.2)

which would print, for instance, a vector of 25 into two rows of 10
plus an incomplete row of 5. I managed to write a procedure for that
task, as shown below (except that I prefer simply blanks rather than
the NA). I am too embarrassed to even show the procedure. In short, I
like to print in the above FORTRAN format. Thank you.

----

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0.66 0.26 0.82
0.73 0.13 0.05 0.56 0.67 0.74 0.87 [2,] 0.91 0.25 0.40 0.39 0.50 0.89
0.07 0.84 0.14 0.75 [3,] 0.38 0.08 0.86 0.97 0.56 NA NA NA NA NA

     [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


        [[alternative HTML version deleted]]


______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to