\input texinfo
@c %**start of header
@setfilename rw-FAQ.info
@settitle R for Windows FAQ
@setchapternewpage on
@set VERSION @RWVER@
@set RVERSION @RVER@
@c %**end of header
@documentlanguage en
@documentencoding ISO-8859-1

@finalout

@macro newchap{}
@ifinfo
@sp 1
@end ifinfo
@ifhtml
@html
<hr>
@end html
@end ifhtml
@end macro

@titlepage
@title R for Windows FAQ
@subtitle Frequently Asked Questions on R for Windows
@subtitle Version @value{VERSION}
@author B. D. Ripley and D. J. Murdoch
@end titlepage

@ifinfo
R for Windows FAQ                           @*
Frequently Asked Questions on R for Windows @*
Version for @value{VERSION}                 @*
B. D. Ripley and D. J. Murdoch              @*

@sp 2
@end ifinfo

@ifhtml
@html
<h2>Version for <tt>@value{VERSION}</tt></h2>
<address>B. D. Ripley and D. J. Murdoch</address>
<hr>
@end html
@end ifhtml

@paragraphindent 0

@contents

@ifinfo
@sp 1
@end ifinfo


@node Top, Introduction, (dir), (dir)

@menu
* Introduction::                
* Installation and Usage::      
* Languages and Internationalization::  
* Packages::                    
* Windows Features::            
* Workspaces::                  
* The R Console::               
* Building from Source::        
@end menu


@newchap{}
@node Introduction, Installation and Usage, Top, Top
@chapter Introduction

This FAQ is for the Windows port of R: it describes features specific to
that version.  The main R FAQ can be found at

@display
@uref{https://CRAN.R-project.org/doc/FAQ/R-FAQ.html}.
@end display

The information here applies only to recent versions of R for Windows,
(@samp{3.1.0} or later).  It is biased towards users of 64-bit Windows.


@newchap{}
@node Installation and Usage, Languages and Internationalization, Introduction, Top
@chapter Installation and Usage

@menu
* Where can I find the latest version?::  
* How do I install R for Windows?::  
* How do I check an installation?::  
* Can I customize the installation?::  
* How do I run it?::            
* Can I run R from a CD or USB drive?::  
* How do I UNinstall R?::       
* What's the best way to upgrade?::  
* There seems to be a limit on the memory it uses!::  
* How can I keep workspaces for different projects in different directories?::  
* How do I print from R?::      
* Can I use R CMD BATCH?::      
* Can I use @RWVER@ with ESS and Emacs?::  
* What are HOME and working directories?::  
* How do I set environment variables?::  
* R can't find my file::        
* Does R use the Registry?::    
* Does R support automation?::  
* The Internet download functions fail.::  
* Entering certain characters crashes Rgui.::  
* What does 'DLL attempted to change FPU control word' mean?::  
* Other strange crashes.::      
* Why does R never use more than 50% of my CPU?::  
* Does R run under Windows Vista?::  
* Quotes don't come out right on the console/terminal/pager::  
* There is no tilde on my keyboard::  
* Can I use R on 64-bit Windows?::  
* Should I run 32-bit or 64-bit R?::  
* Can both 32- and 64-bit R be installed on the same machine?::  
* Rcmd is not found in my PATH!::  
@end menu


@node Where can I find the latest version?, How do I install R for Windows?, Installation and Usage, Installation and Usage
@section Where can I find the latest version?

Go to any CRAN site (see @uref{https://cran.r-project.org/@/mirrors.html}
for a list), navigate to the @file{bin/windows/base} directory and
collect the file(s) you need.  The current release is distributed as an
installer @samp{@RWVER@-win.exe} of about 65MB.

There are also links on that page to the @samp{r-patched} and
@samp{r-devel} snapshots.  These are frequently updated builds of
development versions of R.  The @samp{r-patched} build includes bug
fixes to the current release, and @samp{r-devel} contains these as well
as changes that are planned to eventually make it into the next
@samp{x.y.0} release.

@node How do I install R for Windows?, How do I check an installation?, Where can I find the latest version?, Installation and Usage
@section How do I install R for Windows?

Current binary versions of R are known to run on Windows 7 or later, including on
64-bit versions: @xref{Can I use R on 64-bit Windows?}. The last version
known to run on Windows 2000 was 2.12.2.  Windows XP is no longer supported.

@c 2000 went end-of-life 2010-07-13
@c XP SP3 went end of life 2014-04-08

We only test on versions of Windows currently supported by Microsoft,
mainly 64-bit Windows 7, Windows Server 2008 and Windows 10.

Your file system must allow case-honouring long file names (as is likely
except perhaps for some network-mounted systems).  An installation takes
up to 150MB of disk space.

If you want to be able to build packages from sources, we recommend that
you choose an installation path not containing spaces.  (Using a path
with spaces in will probably work, but is little-tested.)  Users of
Vista/Windows 7/8/Server 2008/2012 installing for a single user using an
account with administrator rights@footnote{Non-administrator accounts
will automatically be offered a default installation directory in the
user area.} should consider installing into a non-system area (such as
@file{C:\R}).  Installing to a network share (a filepath starting with
@code{\\machine\...}) is not supported: such paths will need to mapped
to a network drive.

To install use @samp{@RWVER@-win.exe}.  Just double-click on the icon
and follow the instructions.  If you have an account with Administrator
privileges you will be able to install R in the @file{Program Files}
area and to set all the optional registry entries; otherwise you will
only be able to install R in your own file area.  You may need to
confirm that you want to proceed with installing a program from an
`unknown' or `unidentified' publisher.

After installation you should choose a working directory for R.  You
will have a shortcut to @file{Rgui.exe} on your desktop and/or somewhere
on the Start menu file tree, and perhaps also in the Quick Launch part
of the taskbar (Vista and earlier).  Right-click each shortcut, select
Properties... and change the `Start in' field to your working directory.
(If your account was not the one used for installation, you may need to
copy the shortcut before editing it.)

On some systems you will have two shortcuts, one for 32-bit with a label
starting @code{R i386} and one for 64-bit starting @code{R x64}
(@pxref{Should I run 32-bit or 64-bit R?})

You may also want to add command-line arguments at the end of the
Target field (@emph{after} any final double quote, and separated by a
space), for example @code{--sdi --max-mem-size=1G}.  You can also set
environment variables at the end of the Target field, for example
@code{R_LIBS=p:/myRlib}, and if you want to ensure that menus and
messages are in (American) English, @code{LANGUAGE=en}.

It is also possible to install from an MSI file, which will be of
interest only for system administrators.  For how to build the MSI file,
see the `R Installation and Administration Manual'.


@node How do I check an installation?, Can I customize the installation?, How do I install R for Windows?, Installation and Usage
@section How do I check an installation is not corrupt?

Relates to earlier installers, removed in R 2.11.0.

@node Can I customize the installation?, How do I run it?, How do I check an installation?, Installation and Usage
@section Can I customize the installation?

The normal way to customize the installation is by selecting components
from the wizards shown by the installer.  However, sysadmins might like
to install R from scripts, and the following command-line flags are
available for use with the installer.

@table @samp
@item /SILENT
only show the installation progress window and error messages.
@item /VERYSILENT
only show error messages.
@item /DIR="x:\dirname"
set the default installation directory
@item /GROUP="folder name"
set the default Start-menu group name
@item /COMPONENTS="comma separated list of component names"
set the initial list of components: Components are named @samp{main},
@samp{i386}, @samp{x64} and @samp{translations}.
@end table

@noindent
It is also possible to save the settings used to a file and later
reload those settings using

@table @samp
@item /SAVEINF="filename"
save the settings to the specified file.  Don't forget to use the quotes if
the filename contains spaces.
@item /LOADINF="filename"
instructs the installer to load the settings from the specified file
after having checked the command line.
@end table

A successful installation has exit code 0: unsuccessful ones may give 1,
2, 3, 4 or 5.  See the help for Inno Setup
(@uref{http://jrsoftware.org/}) for details.

We have some facilities for building a customized installer, in
particular to add packages to the installer.  See the `R Installation
and Administration' manual in the subsection `Building the installers'.

@node How do I run it?, Can I run R from a CD or USB drive?, Can I customize the installation?, Installation and Usage
@section How do I run it?

Just double-click on the shortcut you prepared at installation.

If you want to set up another project, make a new shortcut or use the
existing one and change the `Start in' field of the Properties.

You may if you prefer run R from the command line of any shell you use,
for example a `Command Prompt' or a port of a Unix shell such as
@command{tcsh} or @command{bash}. (The command line can be anything you
would put in the Target field of a shortcut, and the starting directory
will be the current working directory of the shell.  Note that the R
executables are not by default added to the @env{PATH}.)  People running
from a terminal usually prefer to run @command{Rterm.exe} and not
@command{Rgui.exe}.

@node Can I run R from a CD or USB drive?, How do I UNinstall R?, How do I run it?, Installation and Usage
@section Can I run R from a CD or USB drive?

Yes, with care.  A basic R installation is relocatable, so you can burn
an image of the R installation on your hard disc or install directly
onto a removable storage device such as a flash-memory USB drive.

Running R does need access to a writable temporary directory and to a
home directory, and in the last resort these are taken to be the current
directory.  This should be no problem on a properly configured version
of Windows, but otherwise does mean that it may not be possible to run R
without creating a shortcut starting in a writable folder.


@node How do I UNinstall R?, What's the best way to upgrade?, Can I run R from a CD or USB drive?, Installation and Usage
@section How do I UNinstall R?

Normally you can do this from the @samp{Programs and Features} group in
the Control Panel.  If it does not appear there, run @file{unins000.exe}
in the top-level installation directory.  On recent versions of Windows
you may be asked to confirm that you wish to run a program from an
`unknown' or `unidentified' publisher.

Uninstalling R only removes files from the initial installation, not
(for example) packages you have installed or updated.

If all else fails, you can just delete the whole directory in which R
was installed.


@node What's the best way to upgrade?, There seems to be a limit on the memory it uses!, How do I UNinstall R?, Installation and Usage
@section What's the best way to upgrade?

That's a matter of taste.  For most people the best thing to do is to
uninstall R (see the previous Q), install the new version, copy any
installed packages to the library folder in the new installation, run
@code{update.packages(checkBuilt=TRUE, ask=FALSE)} in the new R and then
delete anything left of the old installation.  Different versions of R
are quite deliberately installed in parallel folders so you can keep old
versions around if you wish.

For those with a personal library (folder @file{R\win-library\@var{x.y}}
of your home directory, @file{R\win64-library\@var{x.y}} on 64-bit
builds), you will need to update that too when the minor version of R
changes (e.g.@: from 3.0.2 to 3.1.0).  A simple way to do so is to
copy (say) @file{R\win-library\3.0} to @file{R\win-library\3.1} before
running @code{update.packages(checkBuilt=TRUE, ask=FALSE)}.


@node There seems to be a limit on the memory it uses!, How can I keep workspaces for different projects in different directories?, What's the best way to upgrade?, Installation and Usage
@section There seems to be a limit on the memory it uses!

Indeed there is.  It is set by the command-line flag
@option{--max-mem-size} (@pxref{How do I install R for Windows?}) or by
environment variable @env{R_MAX_MEM_SIZE}. 

For a 64-bit build of R it defaults to the amount of RAM.

For a 32-bit build of R it defaults to the smaller of the amount of
physical RAM in the machine and 0.5GB less than the limit on user
virtual memory for a process (most often 2GB when using a 32-bit edition
of Windows).

Use @code{?Memory} and @code{?memory.size} for information about memory
usage.  The limit can be raised (if possible) by calling
@code{memory.limit} within a running R session.

The 32-bit executables support up to 3GB of user address space per
process under suitably enabled versions of 32-bit Windows (see
@uref{https://docs.microsoft.com/@/en-gb/@/windows/@/desktop/@/Memory/@/physical-address-extension},
@uref{https://docs.microsoft.com/@/en-gb/@/windows/@/desktop/@/Memory/@/4-gigabyte-tuning};
this is not enabled by default).  On such systems, the default for
@code{--max-mem-size} is the smaller of the amount of RAM and 2.5GB.  On
all but the earliest 64-bit versions of Windows the user address space
for a 32-bit process is 4GB, and there the default for
@code{--max-mem-size} is the smaller of the amount of RAM and 3.5GB.


@c limits are documented at http://msdn.microsoft.com/en-us/library/aa366778%28VS.85%29.aspx

@node How can I keep workspaces for different projects in different directories?, How do I print from R?, There seems to be a limit on the memory it uses!, Installation and Usage
@section How can I keep workspaces for different projects in different directories?

Create a separate shortcut for each project: see Q2.5.  All the paths to
files used by R are relative to the starting directory, so setting the
`Start in' field automatically helps separate projects.

Alternatively, start R by double-clicking on a saved @file{.RData} file
in the directory for the project you want to use, or drag-and-drop a
file with extension @file{.RData} onto an R shortcut.  In either case,
the working directory will be set to that containing the file.


@node How do I print from R?, Can I use R CMD BATCH?, How can I keep workspaces for different projects in different directories?, Installation and Usage
@section How do I print from R?

It depends what you want to print.

@itemize @bullet
@item
You can print the graphics window from its menu or by using
@code{dev.print} with suitable arguments (see its help page: most likely
@code{dev.print(win.graph)} will work).

@item
You can print from the R console or pager by @samp{File | Print}.
(This will print the selection if there is one, otherwise the whole
console or pager contents.)

@item
You can print help files from the pager or HTML browser.

@item
If you have LaTeX installed and a PDF printing system you
can print help files by @code{help(fn_name, help_type="PDF")}.
@end itemize


@node Can I use R CMD BATCH?, Can I use @RWVER@ with ESS and Emacs?, How do I print from R?, Installation and Usage
@section Can I use @code{R CMD BATCH}?

Yes: use @code{R CMD BATCH --help} or @code{?BATCH} for full details.

You can also set up a batch file using @command{Rterm.exe}.  A sample
batch file might contain (as one line)

@example
path_to_R\bin\x64\Rterm.exe --no-restore --no-save < %1 > %1.out 2>&1
@end example

@noindent
The purpose of @code{2>&1} is to redirect warnings and errors to the
same file as normal output.


@node Can I use @RWVER@ with ESS and Emacs?, What are HOME and working directories?, Can I use R CMD BATCH?, Installation and Usage
@section Can I use @RWVER@ with ESS and Emacs?

Yes.  ESS has for a long time supported R under Windows: it does so by
running @code{Rterm.exe} without a visible console.

For help with ESS, please send email to @email{ESS-help@@stat.ethz.ch},
not the R mailing lists.


@node What are HOME and working directories?, How do I set environment variables?, Can I use @RWVER@ with ESS and Emacs?, Installation and Usage
@section What are HOME and working directories?

Several places in the documentation use these terms.

The working directory is the directory from which @code{Rgui} or
@command{Rterm} was launched, unless a shortcut was used when it is given
by the `Start in' field of the shortcut's properties.  You can find this
from R code by the call @code{getwd()}.

The home directory is set as follows: If environment variable
@env{R_USER} is set, its value is used.  Otherwise if environment
variable @env{HOME} is set, its value is used.  After those two
user-controllable settings, R tries to find system-defined home
directories.  It first tries to use the Windows "personal" directory
(typically @file{C:\Users\username\Documents}).  If that fails, if both
environment variables @env{HOMEDRIVE} and @env{HOMEPATH} are set (and
they normally are), the value is @file{$@{HOMEDRIVE@}$@{HOMEPATH@}}.  If
all of these fail, the current working directory is used.

You can find this from R code by @code{Sys.getenv("R_USER")} or
@code{normalizePath("~")}, @samp{~} being Unix notation for the home directory.

@node How do I set environment variables?, R can't find my file, What are HOME and working directories?, Installation and Usage
@section How do I set environment variables?

Environment variables can be set for @command{Rgui.exe} and
@command{Rterm.exe} in three different ways.
@enumerate
@item
On the command line as name=value pairs.  For example in the shortcut to
@command{Rgui} you could have

@example
"path_to_R\bin\x64\Rgui.exe" HOME=p:/ R_LIBS=p:/myRlib
@end example

@item
In an environment file @file{.Renviron} in the working directory
or in your home directory, for example containing the line

@example
R_LIBS=p:/myRlib
@end example

If you have permission to do so, you can also create an environment file
@file{etc\Renviron.site} and set environmental variables in that file in
the same way.  This is useful for variables which should be set for all
users and all usages of this R installation.  (Their values can be
overridden in a @file{.Renviron} file or on the command line.)

See @code{?Startup} for more details of environment files.

@item
For all applications via Windows.  How you set an environment variable
is system-specific: under recent versions of Windows, go to `User
Accounts' in the Control Panel, and select your account and then `Change
my environment variables'.
@end enumerate

The order of precedence for environmental variables is the order in
which these options are listed, that is the command line then
@file{.Renviron} then the inherited environment.


@node R can't find my file, Does R use the Registry?, How do I set environment variables?, Installation and Usage
@section R can't find my file, but I know it is there!

How did you specify it?  Backslashes have to be doubled in R character
strings, so for example one needs
@samp{"d:\\@RWVER@\\library\\xgobi\\scripts\\xgobi.bat"}.  You can make
life easier for yourself by using forward slashes as path separators:
they do work under Windows.  You should include the file extension
(e.g.@: @samp{"xgobi.bat"} rather than just @samp{"xgobi"}); sometimes
this isn't shown in Windows Explorer, but it is necessary in R.

A simple way to avoid these problems is to use the function
@code{file.choose()} to invoke the standard Windows file selection
dialog.  If you select a file there, the name will be passed to R in
the correct format.

Another possible source of grief is spaces in folder names.  We have
tried to make R work on paths with spaces in, but many people writing
packages for Unix do not bother.  So it is worth trying the alternative
short name (something like @samp{PROGRA~1}; you can get it as the
`MS-DOS name' from the Properties of the file on some versions of
Windows, and from @command{dir /X} in a @samp{Command Prompt} window),
and using the function @code{shortPathName} from R code.


@node Does R use the Registry?, Does R support automation?, R can't find my file, Installation and Usage
@section Does R use the Registry?

Not when R itself is running.

When you run the R installer, there are options (under @samp{Select
Additional Tasks}) to @samp{Save version number in registry} and (for
Administrator installs) @samp{Associate R with .RData files}.

If you tick the first option, the following string entries are added to the
Windows registry:
@itemize @bullet
@item  @code{HKEY_LOCAL_MACHINE\Software\R-core\R\Current Version}  
    contains the version number, currently @RVER@.
@item @code{HKEY_LOCAL_MACHINE\Software\R-core\R\[version]\InstallPath}
    (where @code{[version]} is currently @RVER@) contains the path to the R 
    home directory.
@end itemize
If you do not have administrative privileges on the machine while
running the installer, then the entries are created under
@code{HKEY_CURRENT_USER}.  The same entries are also created under
@code{Software\R-core\R32} or @code{Software\R-core\R64}, for 32- and
64-bit R respectively.

If you tick the second option (shown with administrative privileges
only) (@samp{Associate R with .RData files}) then entries are created
under @code{HKEY_CLASSES_ROOT\.RData} and
@code{HKEY_CLASSES_ROOT\RWorkspace}.

After installation you can add the Registry entries by running
@code{RSetReg.exe} in a sub-folder of the @code{bin} folder, and remove
them by running this with argument @code{/U}.  Note that this requires
administrative privileges unless run with argument @code{/Personal} and
neither sets up nor removes the file associations.


@node Does R support automation?, The Internet download functions fail., Does R use the Registry?, Installation and Usage
@section Does R support automation (OLE, COM)?

Directly, no.  See packages such as @code{RDCOMClient} from Omegahat
(source and binary packages available from
@uref{https://www.stats.ox.ac.uk/pub/RWin/})
@c @uref{http://www.omegahat.net/} 
and the non-Free project at @uref{http://www.statconn.com/}.

@node The Internet download functions fail., Entering certain characters crashes Rgui., Does R support automation?, Installation and Usage
@section The Internet download functions fail.

for example @code{update.packages()} and the menu items on the Packages menu.

We have had several reports of this, although they do work for us on
@emph{all} of our machines.  There are two known possible causes.

(a) A proxy needs to be set up: see @code{?download.file}.

(b) Firewall settings are blocking the R executables from contacting the
Internet (but this should result in informative error messages from the
firewall program).


@node Entering certain characters crashes Rgui., What does 'DLL attempted to change FPU control word' mean?, The Internet download functions fail., Installation and Usage
@section Entering certain characters crashes Rgui.

This has not been reported for a few years, but used to happen
regularly.  All the occurrences we have solved have been traced to
faulty versions of @samp{msvcrt.dll}: we have installed a workaround
that seems to avoid this.  A few other people have discovered this was
caused by desktop switcher and keyboard macro programs, for example
`Macro Magic' and `JS Pager'.

@node What does 'DLL attempted to change FPU control word' mean?, Other strange crashes., Entering certain characters crashes Rgui., Installation and Usage
@section What does 'DLL attempted to change FPU control word' mean?

This is a @emph{warning} which indicates that R has taken action to
correct the action of some (non-R) DLL which has just been loaded and
has changed the floating point control word (in its initialization code)
to a setting incompatible with that needed for R.  This is not good
practice on the part of the DLL, and often indicates that it needs to be
updated.

Unfortunately, because DLLs may themselves load other DLLs it is not
possible for R to track which DLL caused the problem.

See also @code{?dyn.load}.

@node Other strange crashes., Why does R never use more than 50% of my CPU?, What does 'DLL attempted to change FPU control word' mean?, Installation and Usage
@section Other strange crashes.

Some users have found that @code{Rgui.exe} fails to start, exiting with
a ``Floating-point invalid operation'' or other low level error.  This
error may also happen in the middle of a session.  In some cases where
we have tracked this down, it was due to bugs in the video driver on the
system in question: it makes changes to the floating point control word
which are incompatible with R.  (Good practice would restore the control
word to the state it was in when the driver code was called, and R
tries hard to correct this before running its own code.)  For example,
one user reported that the virtual screen manager JSP2 caused this
crash.

These errors are essentially impossible for us to fix or work around
beyond the measures already taken.  The only solution we know of is for
the user to replace the buggy system component that is causing the
error.


@node Why does R never use more than 50% of my CPU?, Does R run under Windows Vista?, Other strange crashes., Installation and Usage
@section Why does R never use more than 50% of my CPU?

This is a misreading of Windows' confusing Task Manager.  R's
computation is single-threaded, and so it cannot use more than one CPU.
What the task manager shows is not the usage in CPUs but the usage as a
percentage of the apparent total number of CPUs.  We say `apparent' as
it treats so-called `hyper-threaded' CPUs such as two CPUs per core, and
most modern CPUs have at least two cores.

You can see how many `CPU's are assumed by looking at the number of
graphs of `CPU Usage History' on the `Performance' tab of the Windows
Task manager.


@node Does R run under Windows Vista?, Quotes don't come out right on the console/terminal/pager, Why does R never use more than 50% of my CPU?, Installation and Usage
@section Does R run under Windows Vista/7/8/Server 2008?

It does.  A few issues have been reported that are related to the way
accounts and file permissions work.  (These are not specifically R
issues, but changes in user experiences.)

Earlier versions of Windows had user and Administrator accounts, and
user accounts could be give administrative privileges (by being added to
the local Administrators group) and so write permission over system
areas such as @file{c:\Program Files}.  R would be installed either by
users in their own file space or by an account with administrator
privileges into a system area.  Sysadmins could set policies for user
accounts, and you might for example have needed to be a `Power User' to
install software at all.

Vista and later normally disable the Administrator account and expect
software installation to be done by an account which is in the local
Administrator group with `admin approval mode' turned on.  (The
Administrator account by default has it turned off.)  Unlike (say)
Windows XP, such accounts do not run programs with full administrator
privileges, and this is where the issues arise.  These OSes have the
concept of `over-the-shoulder' credentials: if you are running without
full administrator privileges and do something which needs them you may
be prompted with one or more security-check dialog boxes, and may be
required to provide administrator credentials or confirm that you really
want to take that action.

Vista and later will report that the R installer has an `unidentified
publisher' or `unknown publisher' and ask if it should be run.  System
administrators can disable installing applications from non-trusted
sources, in which case you will have to persuade them that R is
trustworthy, or digitally sign the R installer yourself, or (unless this
is also disabled) run the installer from a standard account and install
into your own file area.  (The same issues apply to the @file{.msi}
version of the installer.)

If you install R as a standard user into your own file space and use it
under the same account, there are no known permission issues.

If you use the default Administrator account (without `admin approval
mode' being turned on) and install/update packages (in the system area
or elsewhere), no issues are known.

If you use an account in the local Administrators group in `admin
approval mode' (which is the intended norm under these OSes),
installation will make use of `over-the-shoulder' credentials.  You will
run into problems if you try installing (including updating) packages in
the main R library.  (It would be nice if at that point R could use
over-the-shoulder credentials, but they apply to processes as a whole.
Vista and later disallow creating @code{.dll} files in the system area
without credentials.)  There are several ways around this.

@itemize
@item
Run R with Administrator privileges in sessions where you want to
install packages.  (Do so by right-clicking on the R shortcut and
selecting 'Run as Administrator'.)

@item
Transfer ownership of the R installation to the user which installed R.
To do so, use the security tab on the @samp{Properties} of the top-level
R folder and give `Full Control' over this directory to the user (not
just the Administrator group).

@item
Install packages into a different library tree owned by the account used to
install R.

For an installation to be used by a single user, the simplest way is to
make use of a `personal library': @xref{I don't have permission to write
to the @RWVER@\library directory}.

For a site installation, you can create a site-wide library directory
anywhere convenient, and add it to the default package search path for
all users via @env{R_LIBS_SITE} in @file{etc\Renviron.site}.  @xref{What
are HOME and working directories?}.  There is a standard location for a
site library, the @file{site-library} directory in the top-level R
folder (which you would need to create with full control for the R
installation account).  This will be used for installation in preference
to the main library folder if it exists.

This approach will not allow you to update the recommended packages
unless you `Run as administrator': we suggest you use an R session
running under Administrator privileges when updating those.
@end itemize


Another issue with Vista was that the standard POSIX ways that R uses
(e.g.@: in @code{file.info} and @code{file.access}) to look at file
permissions no longer work reliably.  @code{file.access} was re-written
to work with Windows NT-based security and the new version seems much
more reliable with these OSes (but still not 100% correct).

On suitably recent hardware Vista and later can prevent the execution of
code from data areas via `Data Execution Prevention' (from a tab in
System Properties -> Advanced -> Performance), and sysadmins can turn
this on for all programs.  R runs correctly with DEP enabled.


@node Quotes don't come out right on the console/terminal/pager, There is no tilde on my keyboard, Does R run under Windows Vista?, Installation and Usage
@section Quotes don't come out right on the console/terminal/pager.

R may make use of directional quotes that are not always rendered
correctly by Windows: these are used by default only by @code{Rgui} in
suitable locales (not Chinese/Japanese/Korean).

Whether these are used in R output (from functions @code{sQuote} and
@code{dQuote}) is controlled by @code{getOption("useFancyQuotes")} whose
default is @code{FALSE} except for the @code{Rgui} console.  There are
two potential problems with rendering directional quotes.  The first is
with running @code{Rterm}: in European locales the `Windows Command
Prompt' is by default set up to use MS-DOS and not Windows default
encodings: this can be changed via @command{chcp}, with @command{chcp
1252} being appropriate for Western European (including English)
locales.  The other is that the default raster fonts only include
directional single quotes and not directional double quotes (which will
probably be rendered as a filled rectangle).

Directional quotes will also be used in text help which is normally
displayed in R's internal pager: these may not be rendered correctly in
an external pager.  They are also used in HTML help, where most browsers
use fonts which render them correctly.

The font used can affect whether quotes are rendered correctly.  The
default font in the @code{Rgui} console and internal pager is
@code{Courier New}, which has directional quotes on all the systems we
tried.  @code{Lucida Console} which has elegant glyphs for directional
quotes (but seems rather light unless ClearType is in use):
@code{Consolas} is another font which we often select when ClearType is
in use.  Non-TrueType fonts such as @code{Courier} and @code{FixedSys}
lack directional double quotes on the systems we tried.

There is a related problem with using @code{Sweave} output in
@code{Rgui}, for LaTeX needs to be told about the encoding of
directional quotes by including in the LaTeX preamble e.g.@: (for a
Western European locale)

@example
\usepackage[cp1252]@{inputenc@}
@end example

@noindent
or their use suppressed by @code{options(useFancyQuotes=FALSE)}.

@node There is no tilde on my keyboard, Can I use R on 64-bit Windows?, Quotes don't come out right on the console/terminal/pager, Installation and Usage
@section There is no tilde on my keyboard!

Where tilde does not appear on the main keyboard, it can normally be
accessed by pressing AltGr (the right Alt key) plus some other key.
This is @code{]} in Canadian (multilingual), German and Scandinavian
layouts, @code{1} in Eastern Europe, @code{[} in Portuguese, @code{4} or
@code{5} in Spanish, @code{/} in Francophone Belgian, and so on.  You
can explore those for your keyboard via the `On-Screen Keyboard' (under
Ease of access on Windows 7).

On all Windows versions you should be able to get tilde by holding the
down the left Alt key and typing 0126 on the numeric keypad (if you have
one), then releasing the Alt key.

@node Can I use R on 64-bit Windows?, Should I run 32-bit or 64-bit R?, There is no tilde on my keyboard, Installation and Usage
@section Can I use R on 64-bit Windows?

The 32-bit build of R for Windows will run on both 32-bit and
64-bit@footnote{what Windows calls x64 for x86-64 CPUs, not the very
rare ia64 Windows for Itanium CPUs.} versions of Windows.  64-bit
versions of Windows run 32-bit executables under the WOW (Windows on
Windows) subsystem: they run in almost exactly the same way as on a
32-bit version of Windows, except that the address limit for the R
process is 4GB (rather than 2GB or perhaps 3GB).

When R is installed on 64-bit Windows there is the option of installing
32- and/or 64-bit builds: the default is to install both. If you are
using the 32-bit build, replace @samp{x64} by @samp{i386} in the
examples in this FAQ.

@node Should I run 32-bit or 64-bit R?, Can both 32- and 64-bit R be installed on the same machine?, Can I use R on 64-bit Windows?, Installation and Usage
@section Should I run 32-bit or 64-bit R?

Obviously, only relevant if you are using 64-bit Windows.

For most users we would recommend using the `native' build, that is the
32-bit version on 32-bit Windows and the 64-bit version of 64-bit Windows.

The advantage of a native 64-bit application is that it gets a 64-bit
address space and hence can address far more than 4GB (how much depends
on the version of Windows, but in principle 8TB).  This allows a single
process to take advantage of more than 4GB of RAM (if available) and for
R's memory manager to more easily handle large objects (in particular
those of 1GB or more).  The disadvantages are that all the pointers are
8 rather than 4 bytes and so small objects are larger and more data has
to be moved around, and that less external software is available for
64-bit versions of the OS. The 64-bit compilers are able to take
advantage of extra features of all x86-64 chips (more registers, SSE2/3
instructions, @dots{}) and so the code may run faster despite using
larger pointers.  The 64-bit build is nowadays usually slightly faster
than the 32-bit build on a recent CPU (Intel Core 2 or later or AMD
equivalent).

For advanced users the choice may be dictated by whether the contributed
packages needed are available in 64-bit builds (although CRAN only
offers 32/64-bit builds).  The considerations can be more complex: for
example 32/64-bit @code{RODBC} need 32/64-bit ODBC drivers respectively,
and where both exist they may not be able to be installed together.  An
extreme example is the Microsoft Access/Excel ODBC drivers: if you have
installed 64-bit Microsoft Office you can only install the 64-bit
drivers and so need to use 64-bit @code{RODBC} and hence R.  (And
similarly for 32-bit Microsoft Office.)

@node Can both 32- and 64-bit R be installed on the same machine?, Rcmd is not found in my PATH!, Should I run 32-bit or 64-bit R?, Installation and Usage
@section Can both 32- and 64-bit R be installed on the same machine?

Obviously, only relevant if the machine is running a 64-bit version of
Windows -- simply select both when using the installer.  You can also go
back and add 64-bit components to a 32-bit install, or @emph{vice versa}.

For many Registry items, 32- and 64-bit programs have different views of
the Registry, but clashes can occur.  The most obvious problem is the
file association for @file{.RData} files, which will use the last
installation for which this option is selected, and if that was for an
installation of both, will use 64-bit R.  To change the association the
safest way is to edit the Registry entry
@samp{HKEY_CLASSES_ROOT\RWorkspace\shell\open\command}
and replace @samp{x64} by @samp{i386} or @emph{vice versa}.


@node Rcmd is not found in my PATH!,  , Can both 32- and 64-bit R be installed on the same machine?, Installation and Usage
@section Rcmd is not found in my PATH!

This has often been reported after an upgrade.

The R installer does not put @command{Rcmd.exe} (nor any other R
executable) on your @env{PATH}.  What seems to have happened is that
people did this for themselves in the past, upgraded R (which by default
will install to a different location) and un-installed the old version
of R.  If you do that (or install R for the first time), you need to
edit the @env{PATH}.

The element you want to add to the path is something like

@example
c:\Program Files\R\R-3.1.0\bin\x64
@end example

@noindent
for 64-bit @command{Rcmd.exe}, replacing @code{x64} by @code{i386} for
32-bit.

How you set the path depends on your OS version.  Under recent versions,
go to `User Accounts' in the Control Panel, and select your account and
then `Change my environment variables'.  (System policies can prevent
end users making changes.)

An alternative is to set the @env{PATH} in the shell you are running
(@command{Rcmd.exe} is  a command-line program).  For those using the
standard Windows `Command Prompt' Duncan Murdoch suggested:
@c https://stat.ethz.ch/pipermail/r-help/2011-October/293413.html

The simple way to do it just for the command prompt is to write a little 
batch file @command{setpath.bat} containing

@example
set PATH=newstuff;%PATH%
@end example

@noindent
and then run @command{cmd} with

@example
CMD /K setpath.bat
@end example


@newchap{}
@node Languages and Internationalization, Packages, Installation and Usage, Top
@chapter Languages and Internationalization

@menu
* The installer does not offer my language::  
* I want R in English!::        
* I want to run R in Chinese/Japanese/Korean::  
* I selected English for installation but R runs in Chinese::  
* I would like to be able to use Japanese fonts::  
* I don't see characters with accents at the R console::  
* The dialog buttons are not translated::  
@end menu

@node The installer does not offer my language, I want R in English!, Languages and Internationalization, Languages and Internationalization
@section The installer does not offer my language.

Only a limited range of languages is supported, currently
Catalan,
both Simplified and Traditional Chinese,
Czech,
Danish,
Dutch,
Finnish,
French,
German,
Greek,
Hebrew,
Hungarian,
Italian,
Japanese,
Korean,
Norwegian,
Polish,
Portuguese (Brazil),
Portuguese (Portugal),
Russian,
Slovenian,
Spanish (Spain)
and Ukranian.

@node I want R in English!, I want to run R in Chinese/Japanese/Korean, The installer does not offer my language, Languages and Internationalization
@section I want R in English (and not in French/Chinese/...)!

The default behaviour of R is to try to run in the language you run
Windows in.

Apparently some users want@footnote{or they may have no choice:
apparently some Windows editions are tied to a specific language.}
Windows in their native language, but not R.  To do so, set
@code{LANGUAGE=en} as discussed in Q2.2 and Q2.15, or in the
@file{Rconsole} file.

@node I want to run R in Chinese/Japanese/Korean, I selected English for installation but R runs in Chinese, I want R in English!, Languages and Internationalization
@section I want to run R in Chinese/Japanese/Korean.

Suitable versions of Windows support what it calls `East Asian'
languages, but e.g.@: Western installations of Windows often do not have
such support.  So we need to assume that your copy of Windows does.

Both @command{Rterm.exe} and @command{Rgui.exe} support single- and
double-width characters.  It will be necessary to select suitable fonts
in files @file{Rconsole} and @file{Rdevga} (see @code{?Rconsole} or the
comments in the files: the system versions are in the @file{etc}
folder); in the latter you can replace @code{Arial} by @code{Arial
Unicode MS}, and we tried @code{FixedSys} and @code{MS Mincho} in
@file{Rconsole}.  (Note that @file{Rdevga} only applies to Windows
graphics devices and not, say, to @code{pdf}.)  

Note that it is important that the console font uses double-width
characters for all CJK characters (as that is what the width table used
assumes): this is true for the fonts intended for CJK locales but not
for example for @code{Lucida Console} or @code{Consolas}.

You do need to ensure that R is running in a suitable locale: use
@code{Sys.getlocale()} to find out.  (CJK users may be used to their
language characters always being available, which is the case for
so-called `Unicode' Windows applications.  However, R is primarily
written for Unix-alikes and is not therefore `Unicode' in the Windows
sense.)  You can find suitable locale names from
@uref{https://msdn.microsoft.com/@/en-us/@/library/@/39cwe7zf%28v=vs.80%29.aspx}
and @uref{https://msdn.microsoft.com/@/en-us/@/library/cdax410z%28v=vs.80%29.aspx}
beware that @code{"Chinese"} is Traditional Chinese (code page 950,
Big5) and @code{"chs"} is needed for Simplified Chinese (code page 936,
GB2312).

When using @command{Rterm} the window in which it is run has to be set
up to use a suitable font (e.g. @code{Lucida Console} or
@code{Consolas}, not the OEM raster fonts) and a suitable codepage
(which for the Windows Cmd shell can be done using @command{chcp}).

@node I selected English for installation but R runs in Chinese, I would like to be able to use Japanese fonts, I want to run R in Chinese/Japanese/Korean, Languages and Internationalization
@section I selected English for installation but R runs in Chinese.

Precisely, you selected English @strong{for installation}!  The language
of the installer has nothing to do with the language used to run R: this
is completely standard Windows practice (and necessary as different
users of the computer may use different languages).

The language R uses for menus and messages is determined by the
@emph{locale}: please read the appropriate manual (`R Installation and
Administration') for the details.  You can ensure that R uses English
messages by appending @code{LANGUAGE=en} to the shortcut you use to
start R, or setting it in the @file{Rconsole} file.

@node I would like to be able to use Japanese fonts, I don't see characters with accents at the R console, I selected English for installation but R runs in Chinese, Languages and Internationalization
@section I would like to be able to use Japanese fonts.

for example, in the console and to annotate graphs.  Similar comments
apply to any non-Western-European language.

With suitable fonts, this should just work.  You will need to set MS
Mincho or MS Gothic as the console font to ensure that single- and
double-width characters are handled correctly.  The default graphics
fonts for the @code{windows()} graphics device can handle most common
Japanese characters, but more specialized fonts may need to be set.
(See Q5.2 for how to set fonts: the console font can also be set from
the `GUI preferences' menu item.)  The help for @code{windowsFonts} has
examples of selecting Japanese fonts for the @code{windows()} family of
devices.

In addition, the Hershey vector fonts (see @code{?Hershey},
@code{?Japanese} and @code{demo(Japanese)}) can be used on any graphics
device to display Japanese characters.

To use non-Latin-1 characters in the @code{postscript} graphics device,
see its help page (which also applies to @code{pdf}).

@node I don't see characters with accents at the R console, The dialog buttons are not translated, I would like to be able to use Japanese fonts, Languages and Internationalization
@section I don't see characters with accents at the R console, for example in ?text.

You need to specify a font in @file{Rconsole} (see Q5.2) that supports
the encoding in use.  This used to be a problem in earlier versions of
Windows, but now it is hard to find a font which does not.

Support for these characters within @command{Rterm} depends on the
environment (the terminal window and shell, including locale and
codepage settings) within which it is run as well as the font used by
the terminal window.  Those are usually on legacy DOS settings and need
to altered.

@node The dialog buttons are not translated,  , I don't see characters with accents at the R console, Languages and Internationalization
@section The dialog buttons are not translated.

In most cases they actually are, but by Windows.  Setting the locale or
the @code{LANGUAGE} environment variable does not change the Windows
setting of its `UI language'.  Vista and later talk about the 'UI
language' and the 'system locale' for setting the language used for
`non-Unicode' programs (on the 'Administrative' tab in Windows 7).

If you have Windows running completely in say French or Chinese these
settings are likely to be consistent.  However, if you try to run
Windows in one language and R in another, you may find the way Windows
handles internationalization slightly odd.
@c For further details see
@c @uref{http://msdn.microsoft.com/@/library/@/default.asp?url=/@/library/@/en-us/@/intl/@/nls_0ddl.asp}.

@newchap{}
@node Packages, Windows Features, Languages and Internationalization, Top
@chapter Packages


@menu
* Can I install packages into libraries in this version?::  
* I don't have permission to write to the @RWVER@\library directory::  
* The packages I installed do not appear in the HTML help system::  
* My functions are not found by the HTML help search system.::  
* Loading a package fails.::    
* Package TclTk does not work.::  
* Hyperlinks in HTML do not work.::  
* update.packages() fails::     
* How do I add to the list of repositories?::  
* Help is not shown for some of the packages::  
* How do I get static HTML pages?::  
* How can I get a binary version of a package?::  
* Package xxx is out of date for Windows::  
* No binary packages appear to be available for my version of R::  
* How do I build my package for both 32- and 64-bit R?::  
@end menu


@node Can I install packages into libraries in this version?, I don't have permission to write to the @RWVER@\library directory, Packages, Packages
@section Can I install packages into libraries in this version?

Yes, but you will need a lot of tools to do so, unless the author or the
maintainers of the @file{bin/windows/contrib} section on CRAN have been
kind enough to provide a binary version for Windows as a
@code{.zip} file, or the package is a simple one involving no compiled
code (and binary versions are usually available for simple
packages).

You can install binary packages either from a repository such as
CRAN or from a local @code{.zip} file by using @code{install.packages}:
see its help page.  There are menu items on the @code{Packages} menu to
provide a point-and-click interface to package installation.  The
packages for each minor (3.x.?) version will be stored in a separate area,
so for R 3.1.? the files are in @file{bin/windows/contrib/3.1}.

Note that the binary versions on CRAN are unsupported: see
@uref{https://cran.r-project.org/@/bin/@/windows/@/contrib/@/3.1/@/ReadMe},
which also gives the locations of a few other binary packages.

If there is no binary package or that is not up-to-date or you prefer
compiling from source, read the `R Installation and Administration'
manual section on `Add-on Packages'.  Source packages which contain no
C/C++/Fortran code which needs compilation can simply be installed by
@code{install.packages(type = "source")} or @command{R CMD INSTALL
pkgname} at a Windows command prompt.  For packages with code that needs
compilation you will need to collect and install several tools: you can
download them via the portal at
@uref{https://cran.r-project.org/bin/windows/Rtools/}.  Once you have done
so, just run @command{R CMD INSTALL pkgname} at a Windows command
prompt.  To check the package (including running all the examples on its
help pages and in its test suite, if any) use @command{R CMD check
pkgname}: see the @emph{`Writing R Extensions'} manual.

Note that setting up Windows to install a source package that needs
compilation is rather tricky; please do ensure that you have followed
the instructions @strong{exactly}.  At least 90% of the questions asked
are because people have not done so.

If you have a source package that is known to work on a Unix-alike
system, you can try the automated Windows binary package builder
documented at @url{https://win-builder.r-project.org}.

@node I don't have permission to write to the @RWVER@\library directory, The packages I installed do not appear in the HTML help system, Can I install packages into libraries in this version?, Packages
@section I don't have permission to write to the @file{@RWVER@\library} directory.

You can install packages anywhere and use the environment variable
@env{R_LIBS} (@pxref{How do I set environment variables?}) to point to
the library location(s).

Suppose your packages are installed in @file{p:\myRlib}.  Then you can
EITHER

@example
set the environment variable R_LIBS to p:/myRlib before starting R
@end example

OR use a package by, e.g.@:

@example
library(mypkg, lib.loc="p:/myRlib")
@end example

You can also have a personal library, which defaults to the directory
@file{R\win-library\@var{x.y}} of your home directory for versions
@var{x.y.z} of R.  This location can be changed by setting the
environment variable @env{R_LIBS_USER}, and can be found from inside R
by running @code{Sys.getenv("R_LIBS_USER")}.  This will only be used if
it exists so you may need to create it: you can use

@example
dir.create(Sys.getenv("R_LIBS_USER"), recursive = TRUE)
@end example

@noindent
to do so.  If you use @code{install.packages} and do not have permission
to write to the main or site library, it should offer to create a personal
library for you and install the packages there.  This will also happen
if @code{update.packages} offers to update packages for you in a library
where you do not have write permission.

There can be additional security issues under Windows Vista and later:
@xref{Does R run under Windows Vista?}.  In particular, the detection
that a standard user has suitable permissions appears to be unreliable
under Vista, so we recommend that you do create a personal directory
yourself.


@node The packages I installed do not appear in the HTML help system, My functions are not found by the HTML help search system., I don't have permission to write to the @RWVER@\library directory, Packages
@section The packages I installed do not appear in the HTML help system.

This question applied to the pre-2.10.0 HTML help system, which has been
replaced.


@node My functions are not found by the HTML help search system., Loading a package fails., The packages I installed do not appear in the HTML help system, Packages
@section My functions are not found by the HTML help search system.

This question applied to the pre-2.10.0 search system, which has been
replaced.


@node Loading a package fails., Package TclTk does not work., My functions are not found by the HTML help search system., Packages
@section Loading a package fails.

Is the package installed for this version of R?   Packages need to have
prepared for R 2.10.0 or later, and packages containing compiled code
for R 2.12.0 or later.

You can tell the version the package was compiled for by looking at the
@samp{Built:} line in its @file{DESCRIPTION} file.

For a small number of binary packages you need to install additional
software and have its DLLs in your @code{PATH}.  Windows will normally
give an informative message about a certain DLL not being found.  See
@uref{https://cran.r-project.org/@/bin/@/windows/@/contrib/@/3.1/@/ReadMe} for a
listing of some of these packages (notably @code{RGtk2},
@code{cairoDevice}, @code{rggobi}, @code{rJava}, @code{rjags} and some
of the packages connecting to databases).


@node Package TclTk does not work., Hyperlinks in HTML do not work., Loading a package fails., Packages
@section Package TclTk does not work.

For package @code{tcltk} to work (try @code{demo(tkdensity)} or
@code{demo(tkttest)} after @code{library(tcltk)}) you need to have Tcl/Tk
installed.  This is part of the R installation, so it should be there.

However, if you have the environment variable @env{MY_TCLTK} set to a
non-empty value, it is assumed that you want to use a different Tcl/Tk
8.6.x installation with the path to its @file{bin} directory given by
value of @env{MY_TCLTK}, and that this is set up correctly (with
@env{TCL_LIBRARY} set if needed).  Note that you do need 8.6.x and not
8.5.x nor 8.4.x, and you do need the architecture to match, that is a
32-bit or 64-bit build of Tcl/Tk to match the R build in use.  (There is
no guarantee that a 64-bit build will work: it depends on the layout it
uses.)

In the past several package authors have suggested using ActiveTcl
(@uref{https://www.activestate.com/@/Products/@/activetcl/}) as a way to
get Tcl/Tk extensions (but the support files do contain the most
commonly used @code{TkTable} and @code{BWidget} extensions).  This could
be used by setting (for a default install)

@example
MY_TCLTK=c:/Tcl/bin
@end example

@noindent
@strong{but} current versions do not by default contain any extra
extensions (although they may be downloaded via the @code{Teacup}
facility) and this only works for 32-bit R.


@node  Hyperlinks in HTML do not work., update.packages() fails, Package TclTk does not work., Packages
@section Hyperlinks in HTML sometimes do not work.

This question was much more relevant prior to version 2.10.0.

They may still not work between packages installed in different libraries
if the HTTP server has been disabled: the remedy is not to do that!

@node update.packages() fails, How do I add to the list of repositories?, Hyperlinks in HTML do not work., Packages
@section @code{update.packages()} fails.

You may not be able to update a package which is in use: Windows `locks'
the package's DLL when it is loaded.  So use @code{update.packages()}
(or the menu equivalent) in a new session.

If you put @code{library(foo)} in your @file{.Rprofile} you will need to
start R with @option{--vanilla} to be able to update package @code{foo}.
If you set @env{R_DEFAULT_PACKAGES} to include @code{foo}, you will
need to unset it temporarily.

It has been reported that some other software has interfered with the
installation process by preventing the renaming of temporary files,
@emph{Google Desktop} being a known example.


@node How do I add to the list of repositories?, Help is not shown for some of the packages, update.packages() fails, Packages
@section How do I add to the list of repositories?

as shown in the @code{Select repositories...} item on the
@code{Packages} menu?

This reads from the tab-delimited file @file{R_HOME\etc\repositories},
which you can edit, or put a modified copy at @file{.R\repositories}
in your HOME directory (@pxref{What are HOME and working directories?}).

@node Help is not shown for some of the packages, How do I get static HTML pages?, How do I add to the list of repositories?, Packages
@section Help is not shown for some of the packages

This was about Compiled HTML help, which has not been supported since R
2.10.0.

@node How do I get static HTML pages?, How can I get a binary version of a package?, Help is not shown for some of the packages, Packages
@section How do I get static HTML pages?

We presume you want to do this for some special purpose: R's help system
will not make use of them, links across library directories will not
work (unlike R < 2.10.0), ambiguous links will be resolved at install
time and missing links will be broken (previous versions used
JavaScript to look for them at run time).  But if you still want them,
here is how to do it.

Static HTML pages are not part of the binary distribution, so you will
need to install R and/or packages from their sources.  To install just a
few packages with static HTML pages use

@example
R CMD INSTALL --html @var{pkg1} @var{pkg2} @dots{}
@end example

To install R itself with static HTML pages you need to build it from the
sources for yourself.  Change the following line in file
@file{MkRules.local} (after copying @file{MkRules.dist} to
@file{MkRules.local} if that has not already been done).

@example
# set this to YES to build static HTML help
BUILD_HTML = NO
@end example

@noindent
and them all packages installed by that build of R will (by default) be
installed with static HTML pages.

@node How can I get a binary version of a package?, Package xxx is out of date for Windows, How do I get static HTML pages?, Packages
@section How can I get a binary version of a package?

Presumably one not available on CRAN, BioC or a similar repository.

If you have a source package that is known to work on a Unix-alike
system, you can try the automated Windows binary package builder
documented at @url{https://win-builder.r-project.org}.  If the package is
not yours, please remember to change the maintainer address so the
results go to you and not the author(s)!

However, if a CRAN package is not available in binary form, this usually
means that there is a problem with some dependent package or external
software (often mentioned in the @file{@@ReadMe} file in the binary
repository directory).  You can email @email{R-windows@@r-project.org}
expressing a wish for such a package to be ported---the maintainers will
take such wishes into account when prioritizing work on binary packages.

In many cases installing packages from the sources is not at all
difficult (it is simple if the package contains no compiled code), so
please attempt that for yourself before requesting help from the busy
volunteers.

@node Package xxx is out of date for Windows, No binary packages appear to be available for my version of R, How can I get a binary version of a package?, Packages
@section Package xxx is out of date for Windows

Here are three possible reasons:

You are simply impatient, and need to wait until the binary package has
been built and propagated to the CRAN mirror you are using.  This
normally (but not always) happens within 24 hours.  Sometimes mirrors
do get behind (especially unofficial ones), so you could try another
mirror.  (Mirror statistics are linked near the top of the CRAN mirror
page at @uref{https://cran.r-project.org/mirrors.html}.)

The latest version of the package might require a later version of R
than the one you are using.  You can check on the package's HTML page on
CRAN, and update your R if needed.

Your R might be too old.  Binary packages for the 3.x series are built
(if possible) whilst 3.(x+1) is current, but building stops once 3.(x+2)
reaches alpha (pre-release, about a month before release).  You can
always try installing from the sources.

@node No binary packages appear to be available for my version of R, How do I build my package for both 32- and 64-bit R?, Package xxx is out of date for Windows, Packages
@section No binary packages appear to be available for my version of R

How old is it?  The CRAN policy is to archive binary packages two years
after the 2.x series is closed.  Other repositories may do so sooner.

If you are using an R version that old we advise you to update your R,
but you do also have the option of installing packages from their
source.


@node How do I build my package for both 32- and 64-bit R?,  , No binary packages appear to be available for my version of R, Packages
@section How do I build my package for both 32- and 64-bit R?

Packages without compiled code nor a @file{configure.win} script will
run on both 32- and 64-bit R.

Packages with compiled code but no @file{configure.win} nor
@code{src/Makefile.win} file will be built for both when running on a
64-bit version of Windows if both versions of R are installed.

An empty @file{configure.win} is treated in the same way as if none
existed.  Also, there is a list of packages known to have an
architecture-independent @file{configure.win} hardcoded into @command{R
CMD INSTALL}, and for these packages, both architectures will be built
under the above conditions.  Other packages can be installed with
@file{configure.win} run for just the first architecture by using option
@option{--force-biarch}. 

Any package can be installed for first one architecture and then the
other with option @option{--merge-multiarch}, but the package source
must be a tarball (and as before, running on a 64-bit version of Windows
with both versions of R installed).

Finally, a package without a @code{src/Makefile.win} file and no or
empty or architecture-independent @code{configure.win} file can be
installed for both architectures from 32-bit Windows if the 64-bit
components were selected when R was installed and option
@option{--compile-both} is given.  Obviously, only the 32-bit
installation can be tested.

@newchap{}
@node Windows Features, Workspaces, Packages, Top
@chapter Windows Features

@menu
* What should I expect to behave differently from the Unix version::  
* I hear about some nifty features.::  
* Circles appear as ovals on screen::  
* How do I move focus to a graphics window or the console?::  
* What does TAB completion do?::  
@end menu


@node  What should I expect to behave differently from the Unix version, I hear about some nifty features., Windows Features, Windows Features
@section  What should I expect to behave differently from the Unix version of R?

@itemize @bullet
@item
R commands can be interrupted by @key{Esc} in @command{Rgui.exe}
and @key{Ctrl-break} or @key{Ctrl-C} in @command{Rterm.exe}:
@key{Ctrl-C} is used for copying in @command{Rgui.exe}.

@item 
Command-line editing is always available, but is somewhat simpler than the
readline-based editing on Unix.  For @command{Rgui.exe}, the menu item
`Help | Console' will give details.  For @command{Rterm.exe} see file
@file{README.rterm}.

@item Paths to files (e.g.@: in @code{source()}) can be specified with
either "/" or "\\".

@item @code{system()} is slightly different: see its help page and that
of @code{shell()}.
@end itemize


@node I hear about some nifty features., Circles appear as ovals on screen, What should I expect to behave differently from the Unix version, Windows Features
@section I hear about some nifty features: please tell me about them!

You have read the file @file{README.@RWVER@}? There are file menus on
the R console, pager and graphics windows.  You can source and save from
those menus, and copy the graphics to @code{png}, @code{jpeg},
@code{bmp}, @code{postscript}, @code{PDF} or @code{metafile}.  There are
right-click menus giving shortcuts to menu items, and optionally
toolbars with buttons giving shortcuts to frequent operations.

If you resize the R console the @code{options(width=)} is automatically
set to the console width (unless disabled in the configuration file).

The graphics has a history mechanism.  As @file{README.@RWVER@} says:

@quotation
`The History menu allows the recording of plots.  When plots have been
recorded they can be reviewed by @key{PgUp} and @key{PgDn}, saved and
replaced.  Recording can be turned on automatically (the Recording item
on the list) or individual plots can be added (Add or the @key{INS}
key).  The whole plot history can be saved to or retrieved from an R
variable in the global environment.
  The format of recorded plots may change between R versions.
  Recorded plots should @strong{not} be used as a permanent
  storage format for R plots.

There is only one graphics history shared by all the windows devices.'
@end quotation

@noindent
The R console and graphics windows have configuration files stored in
the @file{RHOME\etc} directory called @file{Rconsole} and @file{Rdevga};
you can keep personal copies in your @file{HOME} directory.  They contain
comments which should suffice for you to edit them to your
preferences.  For more details see @code{?Rconsole}.
There is a GUI preferences editor invoked from the @code{Edit} menu which
can be used to edit the file @file{Rconsole}.


@node Circles appear as ovals on screen, How do I move focus to a graphics window or the console?, I hear about some nifty features., Windows Features
@section Circles appear as ovals on screen.

The graphics system asks Windows for the number of pixels per inch in
the X and Y directions, and uses that to size graphics (which in R are
in units of inches).  Sometimes the answer is a complete invention, and
in any case Windows will not know exactly how the horizontal and
vertical size have been set on a monitor which allows them to be
adjusted.  You can specify correct values either in the call to
@code{windows} or as options: see @code{?windows}.  (Typically these are
of the order of 100.)

On one of our systems, the screen height was reported as 240mm, and the
width as 300mm in 1280 x 1024 mode and 320mm in 1280 x 960 and 1600 x 1200
modes.  In fact it was a 21" monitor and 400mm x 300mm!

This is less common with LCD screens but not unknown, particularly if
they are not running at their native resolution.

@node How do I move focus to a graphics window or the console?, What does TAB completion do?, Circles appear as ovals on screen, Windows Features
@section How do I move focus to a graphics window or the console?

You may want to do this from within a function, for example when calling
@samp{identify} or @samp{readline}.  Use the function
@samp{bringToTop()}.  With its default argument it brings the active
graphics window to the top and gives it focus.  With argument @samp{-1}
it brings the console to the top and gives it focus.

This works for @command{Rgui.exe} in MDI and SDI modes, and can be used for
graphics windows from @command{Rterm.exe} (although Windows may not always
act on it).


@node What does TAB completion do?,  , How do I move focus to a graphics window or the console?, Windows Features
@section What does TAB completion do?

Both @command{Rgui} and @command{Rterm} support @kbd{TAB} completion.
Hitting @kbd{TAB} whilst entering a command line completes the current
`word' as far as is unambiguously possible.  Hitting @kbd{TAB} a second
time then shows a list of possible completions (or the first few if
there are many): the user can then enter one or more characters and hit
@kbd{TAB} again.

What is it `completing'?  There are two modes: within an unterminated
(single- or double-) quoted expression it completes file
paths.@footnote{It does not have a complete understanding of Windows
file paths, but can complete most relative or absolute file paths,
including drives and spaces. Relative paths on drives are not handled,
for example.}  Otherwise, it is completing R expressions: most obviously
it will match visible R object names and keywords, so @kbd{apr} followed
by @kbd{TAB} will (in a vanilla session) complete to @code{apropos}.
After a function name and parenthesis (e.g.@: @kbd{apropos(}) it will
complete argument names (and @kbd{=}), and after @kbd{$} or @kbd{@@} it
will complete list components or slot names respectively.

This feature can be turned off: @command{Rgui} has two menu items to do
so, and setting the environment variable @env{R_COMPLETION} to
@code{FALSE} turns it off completely for both @command{Rgui} and
@command{Rterm}.  Further, the behaviour can be fine-tuned: to see the
settings available use

@example
?rc.settings
@end example

@noindent
which also explains how the various types of completion work.

This feature is very similar to the completion available in the
@code{readline}-based command line interface on Unix-alikes: the macOS
GUI @code{R.app} has a different completion scheme.

@newchap{}
@node Workspaces, The R Console, Windows Features, Top
@chapter Workspaces


@menu
* My workspace gets saved in a strange place.  How do I stop this?::  
* How do I store my workspace in a different place?::  
* Can I load workspaces saved under Unix/GNU-Linux or macOS?::  
@end menu


@node My workspace gets saved in a strange place.  How do I stop this?, How do I store my workspace in a different place?, Workspaces, Workspaces
@section My workspace gets saved in a strange place: how do I stop this?

Have you changed the working directory?: see Q6.2.


@node How do I store my workspace in a different place?, Can I load workspaces saved under Unix/GNU-Linux or macOS?, My workspace gets saved in a strange place.  How do I stop this?, Workspaces
@section How do I store my workspace in a different place?

Use the `File | Change Dir...' menu item to select a new working
directory: this defaults to the last directory you loaded a file
from.  The workspace is saved in the working directory.  You can also
save a snapshot of the workspace from the `Save Workspace...' menu item.

From the command line you can change the working directory by the
function @code{setwd}: see its help page.


@node Can I load workspaces saved under Unix/GNU-Linux or macOS?,  , How do I store my workspace in a different place?, Workspaces
@section Can I load workspaces saved under Unix/GNU-Linux or Mac macOS?

Yes.  All ports of R use the same format for saved workspaces, so they
are interchangeable (for the same 3.x.? version of R, at least).

Note though that character data in a workspace will be in a particular
encoding that is not recorded in the workspace, so workspaces containing
non-@acronym{ASCII} character data may not be interchangeable even on
the same OS.  Since R marks character data when it knows it to be in
UTF-8 or Latin-1 (including its Windows superset, CP1252), strings in
those encodings are likely to be transferred correctly: fortunately this
covers most of the common cases (macOS normally uses UTF-8, and Linux
users are likely to use UTF-8 or perhaps Latin-1).

It is possible to save references to package namespaces when saving the
workspace: if that happens the package will need to be installed on the
machine loading the workspace.

@newchap{}
@node The R Console, Building from Source, Workspaces, Top
@chapter The R Console


@menu
* The output to the console seems to be delayed::  
* Long lines seem to be truncated.::  
@end menu




@node The output to the console seems to be delayed, Long lines seem to be truncated., The R Console, The R Console
@section When using Rgui the output to the console seems to be delayed.

This is deliberate: the console output is buffered and re-written in
chunks to be faster and less distracting.  You can turn buffering off or
on from the `Misc' menu or the right-click menu: @key{Ctrl-W} toggles
the setting.

If you are sourcing R code or writing from a function, there is another
option.  A call to the R function @code{flush.console()} will write out
the buffer and so update the console.


@node Long lines seem to be truncated.,  , The output to the console seems to be delayed, The R Console
@section Long lines in the console or pager are truncated.

They only @strong{seem} to be truncated: that $ at the end indicates you
can scroll the window to see the rest of the line.  Use the horizontal
scrollbar or the @key{CTRL + left/right arrow} keys to scroll
horizontally. (The @key{left/right arrow} keys work in the pager too.)



@newchap{}
@node Building from Source,  , The R Console, Top
@chapter Building from Source

@menu
* How can I compile R from source?::  
* Can I use a fast BLAS?::      
* How do I include compiled C code?::  
* How do I debug code that I have compiled and dyn.load-ed?::  
* How do I include C++ code?::  
* The output from my C code disappears.::  
* The output from my Fortran code disappears.::  
* The console freezes when my compiled code is running::  
@end menu


@node How can I compile R from source?, Can I use a fast BLAS?, Building from Source, Building from Source
@section How can I compile R from source?

See the `R Installation and Administration' manual (for the version of R
you want to install).

@node Can I use a fast BLAS?, How do I include compiled C code?, How can I compile R from source?, Building from Source
@section  Can I use a fast BLAS?

Fast BLAS (Basic Linear Algebra Subprograms,
@uref{http://www.netlib.org/@/blas/@/faq.html}) routines are used to
speed up numerical linear algebra.  There is support in the R sources
for the `tuned' BLAS called ATLAS
(@uref{http://math-atlas.sourceforge.net}).  The savings can be
appreciable but because ATLAS is tuned to a particular chip we can't use
it generally.  However, linear algebra on large matrices is not often an
important part of R computations, and more typical calculations on small
matrices may run slower.

BLAS support is supplied by the single DLL
@file{R_HOME\bin\x64\Rblas.dll}, and you can add a fast BLAS just by
replacing that.  Replacements for 32-bit R and some of the older common
chips are available on CRAN in directory
@file{bin/windows/contrib/ATLAS}.  See the R Installation and
Administration' manual for how to build an ATLAS @file{Rblas.dll} tuned
to your system using the R sources.  Unfortunately the process has been
less successful when tried for the common current chips such as Intel's
Core 2.

Versions of Dr Kazushige Goto's BLAS (see
@uref{https://en.wikipedia.org/wiki/Kazushige_Goto}) for 64-bit Windows
by Ei-Ji Nakama can be found at
@uref{http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64/}.
Just download the file @file{Rblas.dll} appropriate to your CPU and
replace @file{@var{R_HOME}/bin/x64/Rblas.dll}.  (There is also a generic
version called @samp{DYNAMIC_ARCH} that tries to adapt itself to the CPU
found -- however if you know the exact CPU used it is better to download
the CPU-specific version.  Note that development of that BLAS was frozen
in 2010 so you will not find versions for recent CPUs.)

Note that fast BLAS implementations may give different (and often
slightly less accurate) results than the reference BLAS included in R.

@node  How do I include compiled C code?, How do I debug code that I have compiled and dyn.load-ed?, Can I use a fast BLAS?, Building from Source
@section How do I include compiled C code?

We strongly encourage you to do this @emph{via} building an R package:
see the @emph{`Writing R Extensions'} manual.  In any event you should
get and install the tools and toolchain mentioned in the `R Installation
and Administration' manual.  Then you can use
@example
...\bin\x64\R CMD SHLIB foo.c bar.f
@end example
@noindent
to make @file{foo.dll}.  Use @command{...\bin\x64\R CMD SHLIB --help} for
further options, or see @code{?SHLIB}.  (Replace @code{x64} by
@code{i386} for 64-bit R.)

If you want to use Visual C++, Borland C++ or other compilers, see the
appropriate section in @file{README.packages}.



@node How do I debug code that I have compiled and dyn.load-ed?, How do I include C++ code?, How do I include compiled C code?, Building from Source
@section How do I debug code that I have compiled and dyn.load-ed?

Debugging under Windows is often a fraught process, and sometimes does
not work at all.  If all you need is a @emph{just-in-time} debugger to
catch crashes, consider (32-bit) @code{Dr. Mingw} from the
@code{mingw-utils} bundle on @uref{http://www.mingw.org}.  That will be
able to pinpoint the error, most effectively if you build a version of R
with debugging information as described below.

First, build a version of the R system with debugging information by

@example
make clean
make DEBUG=T
@end example

@noindent
and make a debug version of your package by

@example
Rcmd INSTALL --debug mypkg
@end example

@noindent
You will need a suitable version of @command{gdb} which matches your
compiler.  Then you can debug by

@example
gdb /path/to/@RWVER@/bin/x64/Rgui.exe
@end example

@noindent
(or use @command{Rterm.exe}.)  However, note

@itemize @bullet
@item
@command{gdb} may only be able to find the source code if we run in the
location where the source was compiled (@file{@RWVER@/src/gnuwin32} for
the main system, @file{@RWVER@/src/library/mypkg/src} for a package),
unless told otherwise by the @command{directory} command.  It is most
convenient to set a list of code locations via @command{directory} commands
in the file @file{.gdbinit} in the directory from which @command{gdb} is
run.

@item
It is only possible to set breakpoints in a DLL after the DLL has
been loaded.  So a way to examine the function @code{tukeyline} in
package @code{stats} might be

@example
     gdb ../../../../bin/i386/Rgui.exe
     (gdb) break WinMain
     (gdb) run
     [ stops with R.dll loaded ]
     (gdb) break R_ReadConsole
     (gdb) continue
     [ stops with console running ]
     (gdb) continue
     Rconsole> library(stats)
     (gdb) break tukeyline
     (gdb) clear R_ReadConsole
     (gdb) continue
     Rconsole> example(line)
     ...
@end example

@noindent
Alternatively, in @command{Rgui} you can use the `Misc|Break to
debugger' menu item after your DLL is loaded.  The C function call
@code{breaktodebugger()} will do the same thing.

@item
Fortran symbols need an underline appended.

@item
Windows has little support for signals, so the Unix idea of running a
program under a debugger and sending it a signal to interrupt it and
drop control back to the debugger does not work with a MinGW version of
@command{gdb}.  It does often work with the @code{cygwin} version.

@end itemize


@node  How do I include C++ code?, The output from my C code disappears., How do I debug code that I have compiled and dyn.load-ed?, Building from Source
@section  How do I include C++ code?

You need to do two things:

(a) Write a wrapper to export the symbols you want to call from R as
 @code{extern "C"}.

(b) Include the C++ libraries in the link to make the DLL.  Suppose
@file{X.cc} contains your C++ code, and @file{X_main.cc} is the wrapper,
as in the example in @emph{`Writing R Extensions'}.  Then build the DLL by
(@command{gcc})

@example
...\bin\x64\R CMD SHLIB X.cc X_main.cc
@end example

@noindent
or (VC++, which requires extension @code{.cpp})

@example
cl /MT /c X.cpp X_main.cpp
link /dll /out:X.dll /export:X_main X.obj X_main.obj
@end example

@noindent
and call the entry point(s) in @code{X_R}, such as @code{X_main}.
Construction of static variables will occur when the DLL is loaded, and
destruction when the DLL is unloaded, usually when R terminates.

Note that you will not see the messages from this example in the GUI
console: see the next section.


@node  The output from my C code disappears., The output from my Fortran code disappears., How do I include C++ code?, Building from Source
@section  The output from my C code disappears.  Why?

The @command{Rgui.exe} console is a Windows application: writing to
@code{stdout} or @code{stderr} will not produce output in the
console.  (This will work with @command{Rterm.exe}.)  Use @code{Rprintf} or
@code{REprintf} instead.  These are declared in header file
@file{R_ext/PrtUtil.h}.

Note that output from the console is delayed (@pxref{The output to the
console seems to be delayed}), so that you will not normally see any
output before returning to the R prompt.


@node  The output from my Fortran code disappears., The console freezes when my compiled code is running, The output from my C code disappears., Building from Source
@section  The output from my Fortran code disappears.  Why?

Writing to Fortran output writes to a file, not the @command{Rgui} console.
Use one of the subroutines @code{dblepr}, @code{intpr} or @code{realpr}
documented in the @emph{`Writing R Extensions'} manual.

Note that output from the console is delayed (@pxref{The output to the
console seems to be delayed}), so that you will not normally see any
output before returning to the R prompt even when using the @code{xxxpr}
subroutines.


@node  The console freezes when my compiled code is running,  , The output from my Fortran code disappears., Building from Source
@section The console freezes when my compiled code is running.

The console, pagers and graphics window all run in the same thread
as the R engine.  To allow the console etc to respond to Windows events,
call @code{R_ProcessEvents()} periodically from your compiled code.
If you want output to be updated on the console, call
@code{R_FlushConsole()} and then @code{R_ProcessEvents()}.

@set LASTEDIT 2015-08-13    
@ifhtml
@html
<hr WIDTH="100%">
<address>
Last edited @value{LASTEDIT}: comments to
<code><a href="mailto:R-windows@@R-project.org">R-windows@@r-project.org</a></code>
</address>
@end html
@end ifhtml
@ifinfo
@sp 2
Last edited @value{LASTEDIT}: comments to <R-windows@@r-project.org>
@end ifinfo

@bye

@c Local Variables: ***
@c mode: TeXinfo ***
@c End: ***
