Передача списка символов в file.path в R - PullRequest
2 голосов
/ 11 февраля 2020

Я хочу получить родительский каталог из пути к папке.

говорят, что у меня есть: "C: / Users / YS / 2020 projects / APP / pect / PDC / sr c"

и я хочу получить: "C: / Пользователи / YS / 2020 проекты / APP / pect / PD C"

#Get current directory
cpath = getwd()

#Remove last folder from path
dir <- strsplit(cpath,"/")
dir <- dir[[1]]
parent_dir <- dir[1:length(dir)-1]

#Return file path
file.path(parent_dir)

Это мои переменные среды:

enter image description here

и вот вывод, который я получаю из кода:

[1] "C:"            "Users"         "YS"            "2020 projects" "APP"           "pect"          "PDC"    

Я хочу вернуть:

[1] "C:/Users/YS/2020 projects/APP/pect/PDC"

Почему я не могу передать список символов в file.path ()?

Я немного озадачен тем, как dir в моих переменных среды отображается как символ, а не как список или вектор

Меня также немного смущает, почему strsplit возвращает список с 1 значением в нем?

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Передавая массив в качестве входных данных, он применяет функцию к каждому элементу отдельно. Может быть необходимо использовать paste с массивом.

paste(parent_dir, collapse = "/")

Другой подход, который может быть проще:

dirname(getwd())

Причина, по которой strsplit возвращает список, состоит в том, что он может обрабатывать несколько входов:

 users <- c("c:/users/A", "c:/users/B")
 strsplit(users, "/")

[[1]]
[1] "c:"    "users" "A"    

[[2]]
[1] "c:"    "users" "B"

Для среды dir - это символ array с восемью элементами.

1 голос
/ 11 февраля 2020

Если мы хотим удалить «sr c», опция sub

sub("[/][a-z]+$", "", cpath)

Если мы хотим использовать file.path, где использование

file.path (..., fsep = .Platform $ file.sep)

* ... подразумевает передачу нескольких аргументов один за другим, то есть

file.path(parent_dir[1], parent_dir[2])
#[1] "C:/Users"

и т. Д.

parent_dir
#[1] "C:"            "Users"         "YS"            "2020 projects" "APP"           "pect"          "PDC"         

Если мы хотим скопировать это, можно поместить его в list и использовать file.path с do.call

do.call(file.path, as.list(parent_dir))
#[1] "C:/Users/YS/2020 projects/APP/pect/PDC"

или с Reduce

Reduce(file.path, as.list(parent_dir))
#[1] "C:/Users/YS/2020 projects/APP/pect/PDC"
...