Изменение рабочего каталога внутри функции

#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. Я полагаю, это зависит от того, что еще делает функция. Если это функция, которую вы можете вызвать дважды в одной и той же программе, она, скорее всего, завершится неудачей при втором вызове. Если единственной целью является изменение рабочего каталога, то в этом нет необходимости.