blob: 5ad844543fccd00c05a151662c3772e80e03b27a [file] [log] [blame]
% File src/library/base/man/connections.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2019 R Core Team
% Distributed under GPL 2 or later
\name{connections}
\title{Functions to Manipulate Connections (Files, URLs, ...)}
\alias{connections}
\alias{connection}
\alias{file}
\alias{clipboard}
\alias{pipe}
\alias{fifo}
\alias{gzfile}
\alias{unz}
\alias{bzfile}
\alias{xzfile}
\alias{url}
\alias{socketConnection}
\alias{open}
\alias{open.connection}
\alias{isOpen}
\alias{isIncomplete}
\alias{close}
\alias{close.connection}
\alias{flush}
\alias{flush.connection}
\alias{print.connection}
\alias{summary.connection}
\concept{encoding}
\concept{compression}
\concept{decompression}
\concept{zip}
\concept{gzip}
\concept{bzip2}
\concept{lzma}
\description{
Functions to create, open and close connections, i.e.,
\dQuote{generalized files}, such as possibly compressed files, URLs,
pipes, etc.
}
\usage{
file(description = "", open = "", blocking = TRUE,
encoding = getOption("encoding"), raw = FALSE,
method = getOption("url.method", "default"))
url(description, open = "", blocking = TRUE,
encoding = getOption("encoding"),
method = getOption("url.method", "default"),
headers = NULL)
gzfile(description, open = "", encoding = getOption("encoding"),
compression = 6)
bzfile(description, open = "", encoding = getOption("encoding"),
compression = 9)
xzfile(description, open = "", encoding = getOption("encoding"),
compression = 6)
unz(description, filename, open = "", encoding = getOption("encoding"))
pipe(description, open = "", encoding = getOption("encoding"))
fifo(description, open = "", blocking = FALSE,
encoding = getOption("encoding"))
socketConnection(host = "localhost", port, server = FALSE,
blocking = FALSE, open = "a+",
encoding = getOption("encoding"),
timeout = getOption("timeout"))
open(con, \dots)
\method{open}{connection}(con, open = "r", blocking = TRUE, \dots)
close(con, \dots)
\method{close}{connection}(con, type = "rw", \dots)
flush(con)
isOpen(con, rw = "")
isIncomplete(con)
}
\arguments{
\item{description}{character string. A description of the connection:
see \sQuote{Details}.}
\item{open}{character string. A description of how to open the connection
(if it should be opened initially). See section \sQuote{Modes} for
possible values.}
\item{blocking}{logical. See the \sQuote{Blocking} section.}
\item{encoding}{The name of the encoding to be assumed. See the
\sQuote{Encoding} section.}
\item{raw}{logical. If true, a \sQuote{raw} interface is used which
will be more suitable for arguments which are not regular files,
e.g.\sspace{}character devices. This suppresses the check for a compressed
file when opening for text-mode reading, and asserts that the
\sQuote{file} may not be seekable.}
\item{method}{character string, partially matched to
\code{c("default", "internal", "wininet", "libcurl")}:
%% FIXME: Consider "auto", as in download.file()
see \sQuote{Details}.}
\item{headers}{named character vector of HTTP headers to use in HTTP
requests. It is ignored for non-HTTP URLs. The \code{User-Agent}
header, coming from the \code{HTTPUserAgent} option (see
\code{\link{options}}) is used as the first header, automatically.}
\item{compression}{integer in 0--9. The amount of compression to be
applied when writing, from none to maximal available. For
\code{xzfile} can also be negative: see the \sQuote{Compression}
section.}
\item{timeout}{numeric: the timeout (in seconds) to be used for this
connection. Beware that some OSes may treat very large values as
zero: however the POSIX standard requires values up to 31 days to be
supported.}
\item{filename}{a filename within a zip file.}
\item{host}{character string. Host name for the port.}
\item{port}{integer. The TCP port number.}
\item{server}{logical. Should the socket be a client or a server?}
\item{con}{a connection.}
\item{type}{character string. Currently ignored.}
\item{rw}{character string. Empty or \code{"read"} or \code{"write"},
partial matches allowed.}
\item{\dots}{arguments passed to or from other methods.}
}
\details{
The first nine functions create connections. By default the
connection is not opened (except for a \code{socketConnection}), but may
be opened by setting a non-empty value of argument \code{open}.
For \code{file} the description is a path to the file to be opened or
a complete URL (when it is the same as calling \code{url}), or
\code{""} (the default) or \code{"clipboard"} (see the
\sQuote{Clipboard} section). Use \code{"stdin"} to refer to the
C-level \sQuote{standard input} of the process (which need not be
connected to anything in a console or embedded version of \R, and is
not in \code{RGui} on Windows). See also \code{\link{stdin}()} for
the subtly different R-level concept of \code{stdin}. See
\code{\link{nullfile}()} for a platform-independent way to get
filename of the null device.
For \code{url} the description is a complete URL including scheme
(such as \samp{http://}, \samp{https://}, \samp{ftp://} or
\samp{file://}). Method \code{"internal"} is that available since
connections were introduced, method \code{"wininet"} is only available
on Windows (it uses the WinINet functions of that OS) and method
\code{"libcurl"} (using the library of that name:
\url{http://curl.haxx.se/libcurl/}) is required on a Unix-alike but
optional on Windows. Method \code{"default"} uses method
\code{"internal"} for \samp{file:} URLs and \code{"libcurl"} for
\code{ftps:} URLs. On a Unix-alike it uses \code{"libcurl"} for
\samp{http:}, \samp{https:} and \samp{ftp:} URLs; on Windows
\code{"wininet"} for \samp{http:}, \samp{ftp:} and \samp{https:} URLs.
Proxies can be specified: see \code{\link{download.file}}.
For \code{gzfile} the description is the path to a file compressed by
\command{gzip}: it can also open for reading uncompressed files and
those compressed by \command{bzip2}, \command{xz} or \command{lzma}.
For \code{bzfile} the description is the path to a file compressed by
\command{bzip2}.
For \code{xzfile} the description is the path to a file compressed by
\command{xz} (\url{https://en.wikipedia.org/wiki/Xz}) or (for reading
only) \command{lzma} (\url{https://en.wikipedia.org/wiki/LZMA}).
\code{unz} reads (only) single files within zip files, in binary mode.
The description is the full path to the zip file, with \file{.zip}
extension if required.
For \code{pipe} the description is the command line to be piped to or
from. This is run in a shell, on Windows that specified by the
\env{COMSPEC} environment variable.
For \code{fifo} the description is the path of the fifo. (Support for
\code{fifo} connections is optional but they are available on most
Unix platforms and on Windows.)
The intention is that \code{file} and \code{gzfile} can be used
generally for text input (from files, \samp{http://} and
\samp{https://} URLs) and binary input respectively.
\code{open}, \code{close} and \code{seek} are generic functions: the
following applies to the methods relevant to connections.
\code{open} opens a connection. In general functions using
connections will open them if they are not open, but then close them
again, so to leave a connection open call \code{open} explicitly.
\code{close} closes and destroys a connection. This will happen
automatically in due course (with a warning) if there is no longer an
\R object referring to the connection.
A maximum of 128 connections can be allocated (not necessarily open)
at any one time. Three of these are pre-allocated (see
\code{\link{stdout}}). The OS will impose limits on the numbers of
connections of various types, but these are usually larger than 125.
\code{flush} flushes the output stream of a connection open for
write/append (where implemented, currently for file and clipboard
connections, \code{\link{stdout}} and \code{\link{stderr}}).
If for a \code{file} or (on most platforms) a \code{fifo} connection
the description is \code{""}, the file/fifo is immediately opened (in
\code{"w+"} mode unless \code{open = "w+b"} is specified) and unlinked
from the file system. This provides a temporary file/fifo to write to
and then read from.
}
\section{URLs}{
\code{url} and \code{file} support URL schemes \samp{file://},
\samp{http://}, \samp{https://} and \samp{ftp://}.
\code{method = "libcurl"} allows more schemes: exactly which schemes
is platform-dependent (see \code{\link{libcurlVersion}}), but all
Unix-alike platforms will support \samp{https://} and most platforms
will support \samp{ftps://}.
Most methods do not percent-encode special characters such as spaces
in \samp{http://} URLs (see \code{\link{URLencode}}), but it seems the
\code{"wininet"} method does.
A note on \samp{file://} URLs. The most general form (from RFC1738) is
\samp{file://host/path/to/file}, but \R only accepts the form with an
empty \code{host} field referring to the local machine.
On a Unix-alike, this is then \samp{file:///path/to/file}, where
\samp{path/to/file} is relative to \file{/}. So although the third
slash is strictly part of the specification not part of the path, this
can be regarded as a way to specify the file \file{/path/to/file}. It
is not possible to specify a relative path using a file URL.
In this form the path is relative to the root of the filesystem, not a
Windows concept. The standard form on Windows is
\samp{file:///d:/R/repos}: for compatibility with earlier versions of
\R and Unix versions, any other form is parsed as \R as \samp{file://}
plus \code{path_to_file}. Also, backslashes are accepted within the
path even though RFC1738 does not allow them.
No attempt is made to decode a percent-encoded \samp{file:} URL: call
\code{\link{URLdecode}} if necessary.
All the methods attempt to follow redirected HTTP URLs, but the
\code{"internal"} method is unable to follow redirections to HTTPS URLs.
Server-side cached data is always accepted.
Function \code{\link{download.file}} and several contributed packages
provide more comprehensive facilities to download from URLs.
}
\value{
\code{file}, \code{pipe}, \code{fifo}, \code{url}, \code{gzfile},
\code{bzfile}, \code{xzfile}, \code{unz} and \code{socketConnection}
return a connection object which inherits from class
\code{"connection"} and has a first more specific class.
\code{open} and \code{flush} return \code{NULL}, invisibly.
\code{close} returns either \code{NULL} or an integer status,
invisibly. The status is from when the connection was last closed and
is available only for some types of connections (e.g., pipes, files and
fifos): typically zero values indicate success. Negative values will
result in a warning; if writing, these may indicate write failures and should
not be ignored.
\code{isOpen} returns a logical value, whether the connection is
currently open.
\code{isIncomplete} returns a logical value, whether the last read
attempt was blocked, or for an output text connection whether there is
unflushed output.
}
\section{Modes}{
Possible values for the argument \code{open} are
\describe{
\item{\code{"r"} or \code{"rt"}}{Open for reading in text mode.}
\item{\code{"w"} or \code{"wt"}}{Open for writing in text mode.}
\item{\code{"a"} or \code{"at"}}{Open for appending in text mode.}
\item{\code{"rb"}}{Open for reading in binary mode.}
\item{\code{"wb"}}{Open for writing in binary mode.}
\item{\code{"ab"}}{Open for appending in binary mode.}
\item{\code{"r+"}, \code{"r+b"}}{Open for reading and writing.}
\item{\code{"w+"}, \code{"w+b"}}{Open for reading and writing,
truncating file initially.}
\item{\code{"a+"}, \code{"a+b"}}{Open for reading and appending.}
}
Not all modes are applicable to all connections: for example URLs can
only be opened for reading. Only file and socket connections can be
opened for both reading and writing. An unsupported mode is usually
silently substituted.
If a file or fifo is created on a Unix-alike, its permissions will be
the maximal allowed by the current setting of \code{umask} (see
\code{\link{Sys.umask}}).
For many connections there is little or no difference between text and
binary modes. For file-like connections on Windows, translation of
line endings (between LF and CRLF) is done in text mode only (but text
read operations on connections such as \code{\link{readLines}},
\code{\link{scan}} and \code{\link{source}} work for any form of line
ending). Various \R operations are possible in only one of the modes:
for example \code{\link{pushBack}} is text-oriented and is only
allowed on connections open for reading in text mode, and binary
operations such as \code{\link{readBin}}, \code{\link{load}} and
\code{\link{save}} can only be done on binary-mode connections.
The mode of a connection is determined when actually opened, which is
deferred if \code{open = ""} is given (the default for all but socket
connections). An explicit call to \code{open} can specify the mode,
but otherwise the mode will be \code{"r"}. (\code{gzfile},
\code{bzfile} and \code{xzfile} connections are exceptions, as the
compressed file always has to be opened in binary mode and no
conversion of line-endings is done even on Windows, so the default
mode is interpreted as \code{"rb"}.) Most operations that need write
access or text-only or binary-only mode will override the default mode
of a non-yet-open connection.
Append modes need to be considered carefully for compressed-file
connections. They do \strong{not} produce a single compressed stream
on the file, but rather append a new compressed stream to the file.
Readers may or may not read beyond end of the first stream: currently
\R does so for \code{gzfile}, \code{bzfile} and \code{xzfile}
connections.
}
\section{Compression}{
\R supports \command{gzip}, \command{bzip2} and \command{xz}
compression (also read-only support for its precursor, \code{lzma}
compression).
For reading, the type of compression (if any) can be determined from
the first few bytes of the file. Thus for \code{file(raw = FALSE)}
connections, if \code{open} is \code{""}, \code{"r"} or \code{"rt"}
the connection can read any of the compressed file types as well as
uncompressed files. (Using \code{"rb"} will allow compressed files to
be read byte-by-byte.) Similarly, \code{gzfile} connections can read
any of the forms of compression and uncompressed files in any read
mode.
(The type of compression is determined when the connection is created
if \code{open} is unspecified and a file of that name exists. If the
intention is to open the connection to write a file with a
\emph{different} form of compression under that name, specify
\code{open = "w"} when the connection is created or
\code{\link{unlink}} the file before creating the connection.)
For write-mode connections, \code{compress} specifies how hard the
compressor works to minimize the file size, and higher values need
more CPU time and more working memory (up to ca 800Mb for
\code{xzfile(compress = 9)}). For \code{xzfile} negative values of
\code{compress} correspond to adding the \command{xz} argument
\option{-e}: this takes more time (double?) to compress but may
achieve (slightly) better compression. The default (\code{6}) has
good compression and modest (100Mb memory) usage: but if you are using
\code{xz} compression you are probably looking for high compression.
Choosing the type of compression involves tradeoffs: \command{gzip},
\command{bzip2} and \command{xz} are successively less widely supported,
need more resources for both compression and decompression, and
achieve more compression (although individual files may buck the
general trend). Typical experience is that \code{bzip2} compression
is 15\% better on text files than \code{gzip} compression, and
\code{xz} with maximal compression 30\% better. The experience with
\R \code{\link{save}} files is similar, but on some large \file{.rda}
files \code{xz} compression is much better than the other two. With
current computers decompression times even with \code{compress = 9}
are typically modest and reading compressed files is usually faster
than uncompressed ones because of the reduction in disc activity.
}
\section{Encoding}{
The encoding of the input/output stream of a connection can be
specified by name in the same way as it would be given to
\code{\link{iconv}}: see that help page for how to find out what
encoding names are recognized on your platform. Additionally,
\code{""} and \code{"native.enc"} both mean the \sQuote{native}
encoding, that is the internal encoding of the current locale and
hence no translation is done.
When writing to a text connection, the connections code always assumes its
input is in native encoding, so e.g. \code{\link{writeLines}} has to
convert text to native encoding. \code{\link{writeLines}} does not do the
conversion when \code{useBytes=TRUE} (for expert use only), but the
connections code still behaves as if the text was in native encoding, so
any attempt to convert encoding (\code{encoding} argument other than
\code{""} and \code{"native.enc"}) in connections will produce incorrect
results.
When reading from a text connection, the connections code, after
re-encoding based on the \code{encoding} argument, returns text that is
assumed to be in native encoding; an encoding mark is only added by
functions that read from the connection, so e.g. \code{\link{readLines}}
can be instructed to mark the text as \code{"UTF-8"} or \code{"latin1"},
but \code{\link{readLines}} does no further conversion. To allow reading
text in \code{"UTF-8"} on a system that cannot represent all such
characters in native encoding (currently only Windows), a connection can
be internally configured to return the read text in UTF-8 even though it
is not the native encoding; currently \code{\link{readLines}} and
\code{\link{scan}} use this feature when given a connection that is not
yet open and, when using the feature, they unconditionally mark the text
as \code{"UTF-8"}.
Re-encoding only works for connections in text mode: reading from a
connection with re-encoding specified in binary mode will read the
stream of bytes, but mixing text and binary mode reads (e.g., mixing
calls to \code{\link{readLines}} and \code{\link{readChar}}) is likely
to lead to incorrect results.
The encodings \code{"UCS-2LE"} and \code{"UTF-16LE"} are treated
specially, as they are appropriate values for Windows \sQuote{Unicode}
text files. If the first two bytes are the Byte Order Mark
\code{0xFEFF} then these are removed as some implementations of
\code{\link{iconv}} do not accept BOMs. Note that whereas most
implementations will handle BOMs using encoding \code{"UCS-2"} and
choose the appropriate byte order, some (including earlier versions of
\code{glibc}) will not. There is a subtle distinction between
\code{"UTF-16"} and \code{"UCS-2"} (see
\url{https://en.wikipedia.org/wiki/UTF-16}): the use of characters in
the \sQuote{Supplementary Planes} which need surrogate pairs is very
rare so \code{"UCS-2LE"} is an appropriate first choice (as it is more
widely implemented).
As from \R 3.0.0 the encoding \code{"UTF-8-BOM"} is accepted for
reading and will remove a Byte Order Mark if present (which it often
is for files and webpages generated by Microsoft applications). If a
BOM is required (it is not recommended) when writing it should be
written explicitly, e.g.\sspace{}by \code{writeChar("\ufeff", con, eos
= NULL)} or \code{writeBin(as.raw(c(0xef, 0xbb, 0xbf)), binary_con)}
Encoding names \code{"utf8"}, \code{"mac"} and \code{"macroman"} are
not portable, and not supported on all current \R platforms.
\code{"UTF-8"} is portable and \code{"macintosh"} is the official
(and most widely supported) name for \sQuote{Mac Roman}. (As from \R
3.4.0, \R maps \code{"utf8"} to \code{"UTF-8"} internally.)
Requesting a conversion that is not supported is an error, reported
when the connection is opened. Exactly what happens when the
requested translation cannot be done for invalid input is in general
undocumented. On output the result is likely to be that up to the
error, with a warning. On input, it will most likely be all or some
of the input up to the error.
It may be possible to deduce the current native encoding from
\code{\link{Sys.getlocale}("LC_CTYPE")}, but not all OSes record it.
}
\section{Blocking}{
Whether or not the connection blocks can be specified for file, url
(default yes), fifo and socket connections (default not).
In blocking mode, functions using the connection do not return to the
\R evaluator until the read/write is complete. In non-blocking mode,
operations return as soon as possible, so on input they will return
with whatever input is available (possibly none) and for output they
will return whether or not the write succeeded.
The function \code{\link{readLines}} behaves differently in respect of
incomplete last lines in the two modes: see its help page.
Even when a connection is in blocking mode, attempts are made to
ensure that it does not block the event loop and hence the operation
of GUI parts of \R. These do not always succeed, and the whole \R
process will be blocked during a DNS lookup on Unix, for example.
Most blocking operations on HTTP/FTP URLs and on sockets are subject to the
timeout set by \code{options("timeout")}. Note that this is a timeout
for no response, not for the whole operation. The timeout is set at
the time the connection is opened (more precisely, when the last
connection of that type -- \samp{http:}, \samp{ftp:} or socket -- was
opened).
}
\section{Fifos}{
Fifos default to non-blocking. That follows S version 4 and is
probably most natural, but it does have some implications. In
particular, opening a non-blocking fifo connection for writing (only)
will fail unless some other process is reading on the fifo.
Opening a fifo for both reading and writing (in any mode: one can only
append to fifos) connects both sides of the fifo to the \R process,
and provides an similar facility to \code{file()}.
}
\section{Clipboard}{
\code{file} can be used with \code{description = "clipboard"}
#ifdef windows
in modes \code{"r"} and \code{"w"} only.
#endif
#ifdef unix
in mode \code{"r"} only. This reads the X11 primary selection (see
\url{http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt}),
which can also be specified as \code{"X11_primary"} and the secondary
selection as \code{"X11_secondary"}. On most systems the clipboard
selection (that used by \sQuote{Copy} from an \sQuote{Edit} menu) can
be specified as \code{"X11_clipboard"}.
#endif
When a clipboard is opened for reading, the contents are immediately
copied to internal storage in the connection.
#ifdef windows
When writing to the clipboard, the output is copied to the clipboard
only when the connection is closed or flushed. There is a 32Kb limit
on the text to be written to the clipboard. This can be raised by
using e.g.\sspace{}\code{file("clipboard-128")} to give 128Kb.
The clipboard works in Unicode wide characters, so encodings might
not work as one might expect.
#endif
#ifdef unix
Unix users wishing to \emph{write} to one of the X11 selections may be
able to do so via \command{xclip}
(\url{http://sourceforge.net/projects/xclip/}) or \command{xsel}
(\url{http://www.vergenet.net/~conrad/software/xsel/}), for example by
\code{pipe("xclip -i", "w")} for the primary selection.
macOS users can use \code{pipe("pbpaste")} and
\code{pipe("pbcopy", "w")} to read from and write to that system's
clipboard.
#endif
}
\section{File paths}{
In most cases these are translated to the native encoding.
The exceptions are \code{file} and \code{pipe} on Windows, where a
\code{description} which is marked as being in UTF-8 is passed to
Windows as a \sQuote{wide} character string. This allows files with
names not in the native encoding to be opened on file systems which
use Unicode file names (such as NTFS but not FAT32).
}
\note{
\R's connections are modelled on those in S version 4 (see Chambers,
1998). However \R goes well beyond the S model, for example in output
text connections and URL, compressed and socket connections.
The default open mode in \R is \code{"r"} except for socket connections.
This differs from S, where it is the equivalent of \code{"r+"},
known as \code{"*"}.
On (rare) platforms where \code{vsnprintf} does not return the needed
length of output there is a 100,000 byte output limit on the length of
a line for text output on \code{fifo}, \code{gzfile}, \code{bzfile} and
\code{xzfile} connections: longer lines will be truncated with a
warning.
}
\references{
Chambers, J. M. (1998)
\emph{Programming with Data. A Guide to the S Language.} Springer.
Ripley, B. D. (2001) Connections. \emph{R News}, \bold{1/1}, 16--7.
\url{https://www.r-project.org/doc/Rnews/Rnews_2001-1.pdf}
}
\seealso{
\code{\link{textConnection}}, \code{\link{seek}},
\code{\link{showConnections}}, \code{\link{pushBack}}.
Functions making direct use of connections are (text-mode)
\code{\link{readLines}}, \code{\link{writeLines}}, \code{\link{cat}},
\code{\link{sink}}, \code{\link{scan}}, \code{\link{parse}},
\code{\link{read.dcf}}, \code{\link{dput}}, \code{\link{dump}} and
(binary-mode) \code{\link{readBin}}, \code{\link{readChar}},
\code{\link{writeBin}}, \code{\link{writeChar}}, \code{\link{load}}
and \code{\link{save}}.
\code{\link{capabilities}} to see if \code{fifo} connections are
supported by this build of \R.
\code{\link{gzcon}} to wrap \command{gzip} (de)compression around a
connection.
\code{\link{options}} \code{HTTPUserAgent}, \code{internet.info} and
\code{timeout} are used by some of the methods for URL connections.
\code{\link{memCompress}} for more ways to (de)compress and references
on data compression.
\code{\link{extSoftVersion}} for the versions of the \code{zlib} (for
\code{gzfile}), \code{bzip2} and \code{xz} libraries in use.
To flush output to the Windows and macOS consoles, see
\code{\link{flush.console}}.
}
\examples{
zzfil <- tempfile(fileext=".data")
zz <- file(zzfil, "w") # open an output file connection
cat("TITLE extra line", "2 3 5 7", "", "11 13 17", file = zz, sep = "\n")
cat("One more line\n", file = zz)
close(zz)
readLines(zzfil)
unlink(zzfil)
zzfil <- tempfile(fileext=".gz")
zz <- gzfile(zzfil, "w") # compressed file
cat("TITLE extra line", "2 3 5 7", "", "11 13 17", file = zz, sep = "\n")
close(zz)
readLines(zz <- gzfile(zzfil))
close(zz)
unlink(zzfil)
zz # an invalid connection
zzfil <- tempfile(fileext=".bz2")
zz <- bzfile(zzfil, "w") # bzip2-ed file
cat("TITLE extra line", "2 3 5 7", "", "11 13 17", file = zz, sep = "\n")
close(zz)
zz # print() method: invalid connection
print(readLines(zz <- bzfile(zzfil)))
close(zz)
unlink(zzfil)
## An example of a file open for reading and writing
Tpath <- tempfile("test")
Tfile <- file(Tpath, "w+")
c(isOpen(Tfile, "r"), isOpen(Tfile, "w")) # both TRUE
cat("abc\ndef\n", file = Tfile)
readLines(Tfile)
seek(Tfile, 0, rw = "r") # reset to beginning
readLines(Tfile)
cat("ghi\n", file = Tfile)
readLines(Tfile)
Tfile # -> print() : "valid" connection
close(Tfile)
Tfile # -> print() : "invalid" connection
unlink(Tpath)
## We can do the same thing with an anonymous file.
Tfile <- file()
cat("abc\ndef\n", file = Tfile)
readLines(Tfile)
close(Tfile)
\dontrun{## fifo example -- may hang even with OS support for fifos
if(capabilities("fifo")) {
zzfil <- tempfile(fileext="-fifo")
zz <- fifo(zzfil, "w+")
writeLines("abc", zz)
print(readLines(zz))
close(zz)
unlink(zzfil)
}}
#ifdef unix
\donttest{
## Unix examples of use of pipes
# read listing of current directory
readLines(pipe("ls -1"))
# remove trailing commas. Suppose
\dontshow{
oldwd <- setwd(tempdir())
writeLines(c("450, 390, 467, 654, 30, 542, 334, 432, 421,",
"357, 497, 493, 550, 549, 467, 575, 578, 342,",
"446, 547, 534, 495, 979, 479"), "data2_")}
\dontrun{\% cat data2_
450, 390, 467, 654, 30, 542, 334, 432, 421,
357, 497, 493, 550, 549, 467, 575, 578, 342,
446, 547, 534, 495, 979, 479}
# Then read this by
scan(pipe("sed -e s/,$// data2_"), sep = ",")
\dontshow{unlink("data2_"); setwd(oldwd)}
# convert decimal point to comma in output: see also write.table
# both R strings and (probably) the shell need \ doubled
zzfil <- tempfile("outfile")
zz <- pipe(paste("sed s/\\\\\\\\./,/ >", zzfil), "w")
cat(format(round(stats::rnorm(48), 4)), fill = 70, file = zz)
close(zz)
file.show(zzfil, delete.file = TRUE)
}
\dontrun{
## example for a machine running a finger daemon
con <- socketConnection(port = 79, blocking = TRUE)
writeLines(paste0(system("whoami", intern = TRUE), "\r"), con)
gsub(" *$", "", readLines(con))
close(con)
}
#endif
\dontrun{
## Two R processes communicating via non-blocking sockets
# R process 1
con1 <- socketConnection(port = 6011, server = TRUE)
writeLines(LETTERS, con1)
close(con1)
# R process 2
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
# as non-blocking, may need to loop for input
readLines(con2)
while(isIncomplete(con2)) {
Sys.sleep(1)
z <- readLines(con2)
if(length(z)) print(z)
}
close(con2)
## examples of use of encodings
# write a file in UTF-8
cat(x, file = (con <- file("foo", "w", encoding = "UTF-8"))); close(con)
# read a 'Windows Unicode' file
A <- read.table(con <- file("students", encoding = "UCS-2LE")); close(con)
}}
\keyword{file}
\keyword{connection}