[R] cannot print a list with cat

Steven T. Yen @tyen @end|ng |rom ntu@edu@tw
Tue Oct 25 04:50:57 CEST 2022


Thanks to all, who have helped greatly. I essentially followed Rui to do:

   fmt_string<-paste0("\ntol     = %.1e","\nreltol  = %.1e","\nsteptol = 
%.1e","\ngradtol = %.1e")
#msg<-sprintf(fmt_string,mycontrol$tol,mycontrol$reltol,mycontrol$steptol,mycontrol$gradtol) 
#works
msg<-with(mycontrol,sprintf(fmt_string,tol,reltol,steptol,gradtol))
   cat(msg)

tol     = 0.0e+00
reltol  = 0.0e+00
steptol = 1.0e-08
gradtol = 1.0e-10

Thids has worked great! Thanks again to all.

Steven Yen

On 10/25/2022 3:23 AM, Rui Barradas wrote:
> Às 16:21 de 24/10/2022, Steven T. Yen escreveu:
>> Thanks to everyone. I read ? sprint and the following is best I came 
>> up with. If there are ways to collapse the lines I'd be glad to know. 
>> Otherwise, I will live with this. Thanks again.
>>
>> cat(sprintf("\ntol     = %e",mycontrol$tol),
>>      sprintf("\nreltol  = %e",mycontrol$reltol),
>>      sprintf("\nsteptol = %e",mycontrol$steptol),
>>      sprintf("\ngradtol = %e",mycontrol$gradtol))
>>
>> tol     = 0.000000e+00
>> reltol  = 0.000000e+00
>> steptol = 1.000000e-08
>> gradtol = 1.000000e-10
>>
>> On 10/24/2022 10:02 PM, Rui Barradas wrote:
>>> Hello,
>>>
>>> There's also ?message.
>>>
>>>
>>> msg <- sprintf("(tol,reltol,steptol,gradtol): %E %E %E %E",
>>>
>>> mycontrol$tol,mycontrol$reltol,mycontrol$steptol,mycontrol$gradtol)
>>> message(msg)
>>>
>>>
>>> Hope this helps,
>>>
>>> Rui Barradas
>>>
>>> Às 14:25 de 24/10/2022, Steven T. Yen escreveu:
>>>> Thank, Boris and Ivan.
>>>>
>>>> The simple command suggested by Ivan ( print(t(mycontrol)) ) 
>>>> worked. I went along with Boris' suggestion and do/get the following:
>>>>
>>>> cat(sprintf("(tol,reltol,steptol,gradtol): %E %E %E %E",mycontrol$tol,
>>>> mycontrol$reltol,mycontrol$steptol,mycontrol$gradtol))
>>>>
>>>> (tol,reltol,steptol,gradtol): 0.000000E+00 0.000000E+00 
>>>> 1.000000E-08 1.000000E-12
>>>>
>>>> This works great. Thanks.
>>>>
>>>> Steven
>>>>
>>>> On 10/24/2022 9:05 PM, Boris Steipe wrote:
>>>>
>>>>> ???  t() is the transpose function. It just happens to return your 
>>>>> list unchanged. The return value is then printed to console if it 
>>>>> is not assigned, or returned invisibly. Transposing your list is 
>>>>> probably not what you wanted to do.
>>>>>
>>>>> Returned values do not get printed from within a loop or from a 
>>>>> source()'d script. That's why it "works" interactively, but not 
>>>>> from a script file.
>>>>>
>>>>> If you want to print the contents of your list, just use:
>>>>>    print(mycontrol)
>>>>>
>>>>> Or use some incantation with sprintf() if you want more control 
>>>>> about the format of what gets printed. Eg:
>>>>>
>>>>>   cat(sprintf("Tolerance: %f (%f %%)", mycontrol$tol, 
>>>>> mycontrol$reltol))
>>>>>
>>>>> etc.
>>>>>
>>>>>
>>>>> B.
>>>>>
>>>>>
>>>>>
>>>>>> On 2022-10-24, at 08:47, Ivan Krylov <krylov.r00t using gmail.com> wrote:
>>>>>>
>>>>>> В Mon, 24 Oct 2022 20:39:33 +0800
>>>>>> "Steven T. Yen" <styen using ntu.edu.tw> пишет:
>>>>>>
>>>>>>> Printing this in a main program causes no problem (as shown above).
>>>>>>> But, using the command t(mycontrol) the line gets ignored.
>>>>>> t() doesn't print, it returns a value. In R, there's 
>>>>>> auto-printing in
>>>>>> the toplevel context (see ?withAutoprint), but not when you move 
>>>>>> away
>>>>>> from the interactive prompt. I think that it should be possible 
>>>>>> to use
>>>>>> an explicit print(t(mycontrol)) to get the behaviour you desire.
>>>>>>
>>>>>> -- 
>>>>>> Best regards,
>>>>>> Ivan
>>>>>>
>>>>>> ______________________________________________
>>>>>> R-help using 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 using 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.
>
> Hello,
>
> Here is a way. I leave it in may code lines to make it more 
> understandale, I hope.
>
>
> # From Spencer's post
> (mycontrol <- list(tol=0, reltol=0, steptol=1e-8, gradtol=1e-12))
> #> $tol
> #> [1] 0
> #>
> #> $reltol
> #> [1] 0
> #>
> #> $steptol
> #> [1] 1e-08
> #>
> #> $gradtol
> #> [1] 1e-12
>
> fmt_string <- paste0(
>   "\ntol     = %e",
>   "\nreltol  = %e",
>   "\nsteptol = %e",
>   "\ngradtol = %e"
> )
>
> msg <- sprintf(fmt_string, mycontrol$tol, mycontrol$reltol, 
> mycontrol$steptol, mycontrol$gradtol)
>
> msg
> #> [1] "\ntol     = 0.000000e+00\nreltol  = 0.000000e+00\nsteptol = 
> 1.000000e-08\ngradtol = 1.000000e-12"
>
> cat(msg)
> #>
> #> tol     = 0.000000e+00
> #> reltol  = 0.000000e+00
> #> steptol = 1.000000e-08
> #> gradtol = 1.000000e-12
>
> message(msg)
> #>
> #> tol     = 0.000000e+00
> #> reltol  = 0.000000e+00
> #> steptol = 1.000000e-08
> #> gradtol = 1.000000e-12
>
>
> You also can write the format string all in a row.
>
>
> msg2 <- with(mycontrol, sprintf("\ntol     = %e\nreltol  = %e\nsteptol 
> = %e\ngradtol = %e", tol, reltol, steptol, gradtol))
> cat(msg2)
> #>
> #> tol     = 0.000000e+00
> #> reltol  = 0.000000e+00
> #> steptol = 1.000000e-08
> #> gradtol = 1.000000e-12
>
>
> Hope this helps,
>
> Rui Barradas
>



More information about the R-help mailing list