Re: [Rd] Print bug for matrix(list(NA_complex_, ...))

From: Stavros Macrakis <macrakis_at_alum.mit.edu>
Date: Wed, 03 Jun 2009 15:04:06 -0400

Quick action, thanks! Does this also fix the spacing problem (at the end of my bug report)?

            -s

On Wed, Jun 3, 2009 at 2:49 PM, William Dunlap <wdunlap_at_tibco.com> wrote:

> Changing the uninitialized 'w' to 'R_print.na_width' for the complex NA
> code fixes up the valgrind complaints on Linux and the bad behavior
> on Windows:
>
> ===================================================================
> --- print.c (revision 48703)
> +++ print.c (working copy)
> @@ -357,7 +357,7 @@
> formatComplex(x, 1, &wr, &dr, &er, &wi, &di, &ei,
> 0);
> if (ISNA(x[0].r) || ISNA(x[0].i))
> snprintf(pbuf, 115, "%s",
> - EncodeReal(NA_REAL, w, 0, 0, OutDec));
> + EncodeReal(NA_REAL, R_print.na_width,
> 0, 0, OutDec)); /* formatReal would set w=R_print.na_width,d=0,e=0 for
> NA */
> else
> snprintf(pbuf, 115, "%s", EncodeComplex(x[0],
> wr, dr, er, wi, di, ei, OutDec));
>
> E.g., the following prints go very quickly and don't have lots of
> trailing
> blanks.
>
> > val <- matrix(list(NA_complex_, 3, "A string", NA_complex_), 2,2)
> > print(val)
> [,1] [,2]
> [1,] NA "A string"
> [2,] 3 NA
> > print(val, na.print="<my personal missing value indicator>")
> [,1]
> [1,] <my personal missing value indicator>
> [2,] 3
> [,2]
> [1,] "A string"
> [2,] <my personal missing value indicator>
>
> Bill Dunlap
> TIBCO Software Inc - Spotfire Division
> wdunlap tibco.com
>
> > -----Original Message-----
> > From: r-devel-bounces_at_r-project.org
> > [mailto:r-devel-bounces_at_r-project.org] On Behalf Of William Dunlap
> > Sent: Wednesday, June 03, 2009 9:21 AM
> > To: Martin Maechler; Wacek Kusnierczyk
> > Cc: r-devel_at_r-project.org
> > Subject: Re: [Rd] Print bug for matrix(list(NA_complex_, ...))
> >
> >
> > > From: William Dunlap
> > > Sent: Wednesday, June 03, 2009 8:58 AM
> > > To: 'Martin Maechler'; Wacek Kusnierczyk
> > > Cc: r-devel_at_r-project.org
> > > Subject: RE: [Rd] Print bug for matrix(list(NA_complex_, ...))
> > ...
> > > > >> There is a bug in printing val <-
> > > > matrix(list(NA_complex_,NA_complex_),1).
> > ...
> > > > >> Note that a large number of spaces are printed
> > > instead of NA.
> > > >
> > > > vQ> on ubuntu 8.04 with r 2.10.0 r48703 there is almost
> > > > no problem (still
> > > > vQ> some unnecessary spaces):
> > > >
> > > > vQ> [,1] [,2]
> > > > vQ> [1,] NA NA
> > > >
> > > > thank you, Waclav.
> > > >
> > > > I don't see any unnecessary space (or other CPU problems),
> > > > using another Linux variant (RHEL 5)
> > > > in the three R version
> > > > 2.9.0 ,
> > > > 2.9.0-patched (r48700)
> > > > 2.10.0-devel (r48700)
> > > >
> > > > Can other Windows (or ...) users confirm problems in R 2.9.0
> > > > (or newer) ?
> > >
> > > I just tried it on 2.9.0 on the Windows GUI (RGui.exe)
> > > and saw similar problems. When printing to the
> > > command window, with either print(val) or show(val) it took
> > > a very long time and put $'s at the ends of the lines
> > > (indicating that there was text beyond the edge of the window).
> > > I used sink() to put the output into a file and then print() and
> > > show() acted quickly. The resulting file had 119 character
> > > lines, consisting mainly of trailing blanks:
> > >
> > > > readLines("c:/temp/val.txt") # output of
> > > print(val);show(val);str(val)
> > > [1] " [,1]
> > > "
> > > [2] "[1,]
> > > "
> > > [3] " [,2]
> > > "
> > > [4] "[1,]
> > > "
> > > [5] " [,1]
> > > "
> > > [6] "[1,]
> > > "
> > > [7] " [,2]
> > > "
> > > [8] "[1,]
> > > "
> > > [9] "List of 2"
> > >
> > > [10] " $ : cplx NA"
> > >
> > > [11] " $ : cplx NA"
> > >
> > > [12] " - attr(*, \"dim\")= int [1:2] 1 2"
> > >
> > > > nchar(readLines("c:/temp/val.txt"))
> > > [1] 119 119 119 119 119 119 119 119 9 12 12 32
> > >
> > > On Linux, using yesterday's 2.9.0, valgrind shows lots
> > > of 'depends on uninitialized value' problems that could
> > > explain the Linux-Windows difference in behavior:
> > >
> > > > val<-matrix(list(NA_complex_,NA_complex_),1)
> > > > val
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6F7E2F: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> >
> > Here is the traceback when it enters Rf_EncodeReal:
> > (gdb) where
> > #0 Rf_EncodeReal (x=nan(0x0000007a2), w=168381312, d=0, e=0, cdec=46
> > '.')
> > at printutils.c:160
> > #1 0x08099aaa in Rf_PrintValueRec (s=0x9f4a4a8, env=0x9e4cc90) at
> > print.c:359
> > #2 0x0809a125 in Rf_PrintValueEnv (s=0x9f4a4a8, env=0x9e4cc90) at
> > print.c:956
> > #3 0x080584cb in Rf_ReplIteration (rho=0x9e4cc90, savestack=0,
> > browselevel=0,
> > state=0xbffc7820) at main.c:261
> > #4 0x08058573 in R_ReplConsole (rho=0x9e4cc90, savestack=0,
> > browselevel=0)
> > at main.c:306
> > #5 0x08058bb9 in run_Rmainloop () at main.c:967
> >
> > It looks like w has a bogus value and was probably never initialized.
> > It is called from print.c:
> >
> > 354 case CPLXSXP:
> > 355 if (LENGTH(tmp) == 1) {
> > 356 Rcomplex *x = COMPLEX(tmp);
> > 357 formatComplex(x, 1, &wr, &dr,
> > &er, &wi, &di,
> > &ei, 0);
> > 358 if (ISNA(x[0].r) || ISNA(x[0].i))
> > 359 snprintf(pbuf, 115, "%s",
> > 360 EncodeReal(NA_REAL, w, 0, 0,
> > OutDec));
> > 361 else
> > 362 snprintf(pbuf, 115, "%s",
> > EncodeComplex(x[0],
> > 363 wr, dr, er, wi, di, ei, OutDec));
> >
> > and I think the 'w' needs to be replaced by something reasonable for
> > printing "NA"
> > (or "NA_complex_?, I don't know all of what this code is used for).
> > Usually complex printing uses wr and wi, not w, so w is not
> > initialized.
> >
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6F7E44: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6F7E4C: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6FA87A: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6F86E8: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x6F86FA: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x711183: _IO_padn (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6F8713: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > ==24859==
> > > ==24859== Conditional jump or move depends on uninitialised value(s)
> > > ==24859== at 0x7111BF: _IO_padn (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6F8713: vfprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x7177A5: vsnprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x6FF4E1: snprintf (in /lib/tls/libc-2.3.4.so)
> > > ==24859== by 0x809DDC1: Rf_EncodeReal (printutils.c:179)
> > > ==24859== by 0x8099AA9: Rf_PrintValueRec (print.c:359)
> > > ==24859== by 0x809A124: Rf_PrintValueEnv (print.c:956)
> > > ==24859== by 0x80584CA: Rf_ReplIteration (main.c:261)
> > > ==24859== by 0x8058572: R_ReplConsole (main.c:306)
> > > ==24859== by 0x8058BB8: run_Rmainloop (main.c:967)
> > > ==24859== by 0x8056A70: main (Rmain.c:33)
> > > Bill Dunlap
> > > TIBCO Software Inc - Spotfire Division
> > > wdunlap tibco.com
> > >
> > > >
> > > > Regards,
> > > > Martin Maechler
> > > >
> > > > >> Compare the
> > > > >> unproblematic real case:
> > > > >>
> > > > >> print(structure(list(NA_real_, NA_real_), .Dim = 1:2))
> > > > >> [,1] [,2]
> > > > >> [1,] NA NA
> > > > >>
> > > > >> Also, when printed in the read-eval-print loop,
> > > > printing takes a very very
> > > > >> long time:
> > > > >>
> > > > >>
> > > > >>> proc.time(); matrix(list(NA_complex_,NA_complex_),1);
> > > > proc.time()
> > > > >>>
> > > > >> user system elapsed
> > > > >> 74.35 0.09 329.45
> > > > >>
> > > > >> [,1]
> > > > >>
> > > > >> [1,]
> > > > >>
> > > > >>
> > > > >> [,2]
> > > > >>
> > > > >> [1,]
> > > > >>
> > > > >> user system elapsed
> > > > >> 92.63 0.15 347.86
> > > > >>
> > > > >> 18 seconds runtime!
> > > > >>
> > > >
> > > > vQ> user system elapsed
> > > > vQ> 0.648 0.056 155.843
> > > > vQ> [,1] [,2]
> > > > vQ> [1,] NA NA
> > > > vQ> user system elapsed
> > > > vQ> 0.648 0.056 155.843
> > > >
> > > > vQ> vQ
> > > >
> > > > vQ> ______________________________________________
> > > > vQ> R-devel_at_r-project.org mailing list
> > > > vQ> https://stat.ethz.ch/mailman/listinfo/r-devel
> > > >
> > > > ______________________________________________
> > > > R-devel_at_r-project.org mailing list
> > > > https://stat.ethz.ch/mailman/listinfo/r-devel
> > > >
> >
> > ______________________________________________
> > R-devel_at_r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>

        [[alternative HTML version deleted]]



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 03 Jun 2009 - 19:10:24 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 03 Jun 2009 - 20:36:52 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive