#r #function #working-directory
#r #функция #рабочий каталог
Вопрос:
Я хочу передать имя каталога в качестве формального аргумента функции. Внутри функции я хочу изменить свой рабочий каталог на каталог, указанный в формальном аргументе. В настоящее время каталог находится внутри моего рабочего каталога.
Примечание:
specdata
является ли каталог внутри моего текущего wd
код:
x <-function(directory)
{
y<-file.path(getwd(),directory)
setwd(y)
}
x(specdata)
Похоже, это не работает, я не хочу вводить "specdata"
в качестве аргумента функции.Так и должно not be in double quotes
быть .
Комментарии:
1. Что вы против использования
x("specdata")
? Использование кавычек почти наверняка будет более простым решением, чем кодирование решения без кавычек.
Ответ №1:
Я не знаю, почему вы хотите избежать двойных кавычек, поскольку вы не объяснили контекст. Но если это действительно то, что вам нужно, то вы можете использовать нестандартную оценку для достижения этой цели.
x <-function(directory) {
directory <- as.character(substitute(directory))
y <-file.path(getwd(),directory)
setwd(y)
}
Использование as.character(substitute())
именно так, например, функция library()
позволяет либо иметь кавычки, либо нет (фактическая строка, которая делает это в библиотечной функции package <- as.character(substitute(package))
.)
Комментарии:
1. чтобы избежать проблем в будущем, функция
orig_wd <- getwd(); on.exit(setwd(orig_wd))
также должна включать.2. @Benjamin я не уверен, что понимаю необходимость этого. Поскольку целью функции является ее побочный эффект изменения рабочего каталога, отмена этого эффекта при выходе, похоже, сводит на нет цель.
3. Я полагаю, это зависит от того, что еще делает функция. Если это функция, которую вы можете вызвать дважды в одной и той же программе, она, скорее всего, завершится неудачей при втором вызове. Если единственной целью является изменение рабочего каталога, то в этом нет необходимости.