This question was motivated by Rmarkdown not outputting results of system command to html file. For some reason, the output of system()
in R (or system2()
) cannot be captured by sink()
or capture.output()
, so currently there is no way for knitr to record the output. For example, in the R console:
> system('ls')
DESCRIPTION
NAMESPACE
R
README.md
inst
man
but in a knitr document, you won't see the output, because capture.output(system('ls'))
is character(0)
, i.e. the output cannot be captured. Of course I can do cat(system('ls', intern = TRUE), sep = '\n')
as I mentioned in the answer of that question, but this is kind of awkward. I wonder if it is a way to capture the output of system()
without using intern = TRUE
and cat()
.
Update: see https://github.com/yihui/knitr/issues/1203 for a hack that I provided to solve the problem.
The system() function is a part of the C/C++ standard library. It is used to pass the commands that can be executed in the command processor or the terminal of the operating system, and finally returns the command after it has been completed. <stdlib. h> or <cstdlib> should be included to call this function.
To store the output of a command in a variable, you can use the shell command substitution feature in the forms below: variable_name=$(command) variable_name=$(command [option ...] arg1 arg2 ...) OR variable_name='command' variable_name='command [option ...] arg1 arg2 ...'
The return value of system() is one of the following: * If command is NULL, then a nonzero value if a shell is available, or 0 if no shell is available. * If a child process could not be created, or its status could not be retrieved, the return value is -1 and errno is set to indicate the error.
You could add a function knitr::system
that masks base::system
. Users could work with it like it was system::base
, but the output can be captured by capture.output
:
system <- function(...) {
stopifnot(!any(names(list(...)) %in% "intern"))
result <- base::system(..., intern = TRUE)
print(result)
}
I admit, that this is somewhat hacky, and to be honest, I'm not sure about possible side effects. But I think it could be worth a try.
I don't think you can do this (at least on *nix systems; I don't have a Windows/Mac system handy) because system
appears to invisibly return the value returned by the command executed, and R doesn't appear to redirect the command's output to the R console.
This is because the stdout
of your terminal is not the same as the R console "stdout". What you see from within your R session is the mix of the terminal's stdout
and the R process output. capture.output
is looking for the R process' output, not all output to stdout
from the parent process.
You can start a process that prints to stdout
, put it in the background, then start R... and you'll see that process' output in your "R output", similar to if you had run system("ping -c5 8.8.8.8")
from R.
josh@computer: /home/josh
> ping -c5 8.8.8.8 & R
[1] 5808
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=39.9 ms
R version 3.2.4 Revised (2016-03-16 r70336) -- "Very Secure Dishes"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> 64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=38.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=38.3 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=46 time=38.4 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=46 time=38.3 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 38.176/38.656/39.986/0.703 ms
> q()
Save workspace image? [y/n/c]: n
[1]+ Done ping -c5 8.8.8.8
josh@computer: /home/josh
>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With