r - titulo - title tag e title heading




Verificar existência de diretório e criar se não existe (5)

A partir de 16 de abril de 2015, com o lançamento do R 3.2.0 há uma nova função chamada dir.exists() . Para usar essa função e criar o diretório, se ele não existir, você poderá usar:

ifelse(!dir.exists(file.path(mainDir, subDir)), dir.create(file.path(mainDir, subDir)), FALSE)

Isso retornará FALSE se o diretório já existir ou não for utilizável, e TRUE se não existir, mas tiver sido criado com sucesso.

Note que para simplesmente verificar se o diretório existe você pode usar

dir.exists(file.path(mainDir, subDir))

Muitas vezes me vejo escrevendo scripts R que geram muita saída. Acho mais limpo colocar essa saída em seu (s) próprio (s) diretório (s). O que escrevi abaixo verificará a existência de um diretório e passará para ele, ou criará o diretório e passará para ele. Existe uma maneira melhor de abordar isso?

mainDir <- "c:/path/to/main/dir"
subDir <- "outputDirectory"

if (file.exists(subDir)){
    setwd(file.path(mainDir, subDir))
} else {
    dir.create(file.path(mainDir, subDir))
    setwd(file.path(mainDir, subDir))

}

Aqui está a verificação simples e cria o dir, se não existir:

## Provide the dir name(i.e sub dir) that you want to create under main dir:
output_dir <- file.path(main_dir, sub_dir)

if (!dir.exists(output_dir)){
dir.create(output_dir)
} else {
    print("Dir already exists!")
}

Eu tive um problema com o R 2.15.3, enquanto tentava criar uma estrutura de árvore recursivamente em uma unidade de rede compartilhada, eu recebia um erro de permissão.

Para contornar essa estranheza, eu manualmente criei a estrutura;

mkdirs <- function(fp) {
    if(!file.exists(fp)) {
        mkdirs(dirname(fp))
        dir.create(fp)
    }
} 

mkdirs("H:/foo/bar")

O uso de file.exists () para testar a existência do diretório é um problema no post original. Se subDir incluía o nome de um arquivo existente (em vez de apenas um caminho), file.exists () retornaria TRUE, mas a chamada para setwd () falharia porque você não pode definir o diretório de trabalho para apontar para um arquivo.

Eu recomendaria o uso de file_test (op = "- d", subDir), que retornará "TRUE" se subDir for um diretório existente, mas FALSE se subDir for um arquivo existente ou um arquivo ou diretório inexistente. Da mesma forma, a verificação de um arquivo pode ser realizada com op = "- f".

Além disso, conforme descrito em outro comentário, o diretório de trabalho faz parte do ambiente R e deve ser controlado pelo usuário, não por um script. Os scripts devem, idealmente, não alterar o ambiente R. Para resolver esse problema, eu poderia usar options () para armazenar um diretório global disponível onde eu queria toda a minha saída.

Portanto, considere a seguinte solução, em que someUniqueTag é apenas um prefixo definido pelo programador para o nome da opção, o que torna improvável que já exista uma opção com o mesmo nome. (Por exemplo, se você estivesse desenvolvendo um pacote chamado "filer", você poderia usar filer.mainDir e filer.subDir).

O código a seguir seria usado para definir opções disponíveis para uso posterior em outros scripts (evitando o uso de setwd () em um script) e para criar a pasta, se necessário:

mainDir = "c:/path/to/main/dir"
subDir = "outputDirectory"

options(someUniqueTag.mainDir = mainDir)
options(someUniqueTag.subDir = "subDir")

if (!file_test("-d", file.path(mainDir, subDir)){
  if(file_test("-f", file.path(mainDir, subDir)) {
    stop("Path can't be created because a file with that name already exists.")
  } else {
    dir.create(file.path(mainDir, subDir))
  }
}

Então, em qualquer script subseqüente que precise manipular um arquivo no subDir, você pode usar algo como:

mainDir = getOption(someUniqueTag.mainDir)
subDir = getOption(someUniqueTag.subDir)
filename = "fileToBeCreated.txt"
file.create(file.path(mainDir, subDir, filename))

Essa solução deixa o diretório de trabalho sob o controle do usuário.


Use showWarnings = FALSE :

dir.create(file.path(mainDir, subDir), showWarnings = FALSE)
setwd(file.path(mainDir, subDir))

dir.create() não falha se o diretório já existir, apenas imprime um aviso. Então, se você pode viver vendo avisos, não há problema em apenas fazer isso:

dir.create(file.path(mainDir, subDir))
setwd(file.path(mainDir, subDir))




r