[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