[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