34 R, ambiente e o sistema de arquivos

O R pode interagir com o sistema de arquivos e o sistema operacional. Nesta seção vamos ver algumas das funcionalidades que informam sobre o ambiente de trabalho no R e também utilidades que podem facilitar o manuseio do programa.

Algumas implementações podem ser específicas para cada sistema operacional (SO). Por exemplo o diretório de trabalho ("workspace") pode ser definido via menu no Windows. Entretando vamos aqui dar preferência a funções que independem do SO. Os exemplos a seguir foram rodados em LINUX mas também podem ser usados em outros SO.

34.1 Ambiente de trabalho

Informações detalhadas sobre a versão do R e plataforma (sistema operacional) são retornadas pelo objeto abaixo. Note que é sempre útil informar a saída deste objeto quando utilizando listas de emails do projeto. As saídas retornadas na forma de uma list podem ainda ser úteis para escrever programas/rotinas que dependam destas informações

  > R.version

                 _
  platform       i686-pc-linux-gnu
  arch           i686
  os             linux-gnu
  system         i686, linux-gnu
  status         Patched
  major          2
  minor          13.0
  year           2011
  month          05
  day            28
  svn rev        56008
  language       R
  version.string R version 2.13.0 Patched (2011-05-28 r56008)

Outros comandos relevantes sobre o sistema e recursos, cuja saída não mostramos aqui incluem:

Outro comando útil é SessionInfo() que informa sobre o sistema operacional e locales (linguagem utilizada pelo sistema), a versão do R, pacotes carregados e e também os recursos (pacotes) disponíveis. As saídas das funções mencionadas podem ser usada quando informando/reportando problemas encontrados em aplicações e/ou quando escrevendo funções que possuam funcionalidades e opções que dependam destas informações.

  > sessionInfo()

  R version 2.13.0 Patched (2011-05-28 r56008)
  Platform: i686-pc-linux-gnu (32-bit)
  
  locale:
   [1] LC_CTYPE=pt_BR.utf8       LC_NUMERIC=C              LC_TIME=pt_BR.utf8
   [4] LC_COLLATE=pt_BR.utf8     LC_MONETARY=C             LC_MESSAGES=pt_BR.utf8
   [7] LC_PAPER=pt_BR.utf8       LC_NAME=C                 LC_ADDRESS=C
  [10] LC_TELEPHONE=C            LC_MEASUREMENT=pt_BR.utf8 LC_IDENTIFICATION=C
  
  attached base packages:
  [1] tools     stats     graphics  grDevices utils     datasets  methods   base

34.2 Área de trabalho

Ao iniciar o R é aberta ou iniciada uma área de trabalho ("workspace") onde os objetos desta sessão poderão ser gravados. A localização "default"desta área de trabalho depende do sistema operacional, permissões etc. Por exemplo, no LINUX é o diretório de onde o R foi iniciado. No Windows é um diretório onde o R foi instalado.

Nos comandos a seguir mostramos como verificar qual o diretório de trabalho sendo usado, guardamos esta informação num objeto, verificamos qual o diretório onde o R foi instalado e como mudar o diretório de trabalho.

  > getwd()

  [1] "/home/paulojus/DEST/aulasR/Rnw"

  > wdir <- getwd()
  > wdir

  [1] "/home/paulojus/DEST/aulasR/Rnw"

  > R.home()

  [1] "/usr/local/lib/R"

  > setwd(R.home())
  > getwd()

  [1] "/usr/local/lib/R"

  > setwd("/home/paulojus")
  > getwd()

  [1] "/home/paulojus"

O R automaticamente mantém um diretório temporário para uso em cada sessão e dentro deste um arquivo. As funções a seguir mostram como obter o caminho e nome do diretório earquivo temporários.

  > tempdir()

  [1] "/tmp/Rtmp2DNOZI"

  > tempfile()

  [1] "/tmp/Rtmp2DNOZI/file42f27b85"

34.3 Manipulação de arquivos e diretórios

Há uma diversidade de funções para interagir com o diretórios e arquivos. Por exemplo dir() vai listar o conteúdo do diretório, e possui vários argumentos para seleção. Informações sobre cada elemento do diretório podem ser obtidas com file.info()

  > getwd()

  [1] "/home/paulojus"

  > dir("../")

  [1] "lost+found" "misc"       "paulojus"

  > setwd(R.home())
  > dir()

   [1] "bin"          "COPYING"      "doc"          "etc"          "include"
   [6] "lib"          "library"      "modules"      "NEWS"         "NEWS.pdf"
  [11] "share"        "SVN-REVISION"

  > args(dir)

  function (path = ".", pattern = NULL, all.files = FALSE, full.names = FALSE,
      recursive = FALSE, ignore.case = FALSE, include.dirs = FALSE)
  NULL

  > file.info("bin")

      size isdir mode               mtime               ctime               atime uid
  bin 4096  TRUE  755 2011-05-29 18:30:51 2011-05-29 18:30:51 2011-05-29 19:02:45   0
      gid uname grname
  bin   0  root   root

  > file.info("bin")$isdir

  [1] TRUE

  > dir(path = "bin")

   [1] "BATCH"         "build"         "check"         "COMPILE"       "config"
   [6] "exec"          "f77_f2c"       "INSTALL"       "javareconf"    "libtool"
  [11] "LINK"          "mkinstalldirs" "pager"         "pgfsweave"     "R"
  [16] "Rcmd"          "Rd2dvi"        "Rdconv"        "Rdiff"         "REMOVE"
  [21] "Rprof"         "Rscript"       "rtags"         "Sd2Rd"         "SHLIB"
  [26] "Stangle"       "Sweave"

  > dir(pattern = "COPY")

  [1] "COPYING"

  > dir(path = "doc")

   [1] "AUTHORS"          "COPYING"          "COPYING.LIB"      "COPYRIGHTS"
   [5] "CRAN_mirrors.csv" "FAQ"              "html"             "KEYWORDS"
   [9] "KEYWORDS.db"      "manual"           "NEWS.rds"         "RESOURCES"
  [13] "THANKS"

  > dir(path = "doc", full = TRUE)

   [1] "doc/AUTHORS"          "doc/COPYING"          "doc/COPYING.LIB"
   [4] "doc/COPYRIGHTS"       "doc/CRAN_mirrors.csv" "doc/FAQ"
   [7] "doc/html"             "doc/KEYWORDS"         "doc/KEYWORDS.db"
  [10] "doc/manual"           "doc/NEWS.rds"         "doc/RESOURCES"
  [13] "doc/THANKS"

É possivel efetuar operações do sistema operacional tais como criar, mover, copiar e remover arquivos e/ou diretórios a partir do R.

  > setwd("/home/paulojus")
  > file.exists("foo.txt")

  [1] TRUE

  > file.create("foo.txt")

  [1] TRUE

  > file.exists("foo.txt")

  [1] TRUE

  > file.rename("foo.txt", "ap.txt")

  [1] TRUE

  > file.exists("foo.txt")

  [1] FALSE

  > file.exists(c("foo.txt", "ap.txt"))

  [1] FALSE  TRUE

  > file.copy("ap.txt", "foo.txt")

  [1] TRUE

  > file.exists(c("foo.txt", "ap.txt"))

  [1] TRUE TRUE

  > file.remove("ap.txt")

  [1] TRUE

  > file.exists(c("foo.txt", "ap.txt"))

  [1]  TRUE FALSE

Da mesma forma é também possível criar e manipular diretórios. Note que a opção recursive=TRUE deve ser usada com muito cuidado pois apaga todo o conteúdo do diretório.

  > getwd()

  [1] "/home/paulojus"

  > dir.create("~/meu.dir")
  > file.copy("foo.txt", "~/meu.dir")

  [1] TRUE

  > dir("~/meu.dir")

  [1] "foo.txt"

  > unlink("~/meu.dir", recursive = TRUE)

Os exemplos acima são na verdade funções que passam comandos para o sistema operacional, seja ele qual for. De forma mais geral comandos do sistema operacional podem ser executados diretamento do R com a função system(), mas a sintaxe do comando fica obviamente dependente do sistema operacional usado (linux, unix, Mac, etc). A seguir ilustramos comandos usados no LINUX. Uma opção interessante é dada pelo argumento intern = TRUE que faz com que o resultado do comando seja convertido num objeto do R, como no exemplo abaixo onde o objeto mdir para a ser um vetor de caracteres com nomes de diretório de trabalho e mais abaixo o objeto arqs é um vetor com os nomes de todos os arquivos existerntes no diretório de trabalho.

  > system("pwd")
  > mdir <- system("pwd", intern = TRUE)
  > mdir
  > system("mkdir FStest.dir")
  > system("touch FStest.dir/arquivo.txt")
  > system("ls FStest.dir")
  > arqs <- system("ls d*.Rnw", intern = TRUE)
  > arqs
  > system("rm -rf FStest.dir")