[R] cannot print a list with cat

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Mon Oct 24 21:23:16 CEST 2022


À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