2014-11-29 3 views
0

Я ищу способ сохранить путь к файлу файла, который был импортирован в R, используя file.choose(). Предположим, у меня есть функция, которая импортирует файл CSV и сохраняет первые N столбцов в новом файле в том же каталоге, что и исходный file.Something, как это:Сохранение пути к файлу, импортированного file.choose() в R

Split<-function(N,...){ 

data<-read.csv(file.choose(),header=T) 

write.csv(data[,1:N],paste("FILE PATH","newdata.csv"),row.names=F)} 

Я хочу иметь «путь к файлу» в быть таким же, как там, где находится исходный файл csv. Из-за механизма file.choose() я не смог найти способ сохранить путь к файлу в объекте внутри функции и использовать его для «FILE PATH».

Любая идея?

Спасибо.

+0

Возможно, вы захотите 'list.files()' вместо этого. 'file.choose()' больше для интерактивного использования. –

+0

@RichardScriven: чтобы пользователь мог выбрать файл в интерактивном режиме, но функция также должна сохранять вывод в том же каталоге. Итак, как 'list.files()' может помочь? – Amin

ответ

4

В этом случае могут быть полезны две функции: dirname и file.path от {base}.

> file_user <- file.choose() 
> file_user 
[1] "C:\\Users\\ohyeah\\Desktop\\chinese.txt" 
> path_user <- dirname(file_user) 
> path_user 
[1] "C:/Users/ohyeahg/Desktop" 
> newfilename <- "myresult.csv" 
> newfilepath <- file.path(path_user, newfilename) 
> newfilepath 
[1] "C:/Users/ohyeah/Desktop/myresult.csv" 
> write.csv(iris, newfilepath) 
> 
# there is a new file 'myresult.csv' created in the same folder 
# and it contains the iris dataset. 

Как вы можете видеть, файл разделитель был изменен с \\ (окон) в / (Linux), однако, вы можете использовать sep аргумент в file.path, чтобы настроить его, которая работает независимо от платформы.


Если вам необходимо получить доступ к нескольким файлам в этом каталоге выбранного пользователем, может быть несколько раз, это будет утомительно восстановить абсолютный путь каждый раз. Вы можете просто установить рабочий каталог в папку выбора пользователя, и вы можете читать или писать только с именами файлов.

> setwd(path_user) 
> newfilename <- "myresult_new.csv" 
> write.csv(iris, newfilename) 
> head(read.csv(newfilename)) 
X Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1 1   5.1   3.5   1.4   0.2 setosa 
2 2   4.9   3.0   1.4   0.2 setosa 
3 3   4.7   3.2   1.3   0.2 setosa 
4 4   4.6   3.1   1.5   0.2 setosa 
5 5   5.0   3.6   1.4   0.2 setosa 
6 6   5.4   3.9   1.7   0.4 setosa 
+0

Отлично. Это то, что я искал. Спасибо. – Amin

+1

@Amin, в зависимости от вашего варианта использования, вы можете подумать о том, чтобы изменить рабочий каталог на выбранный пользователем. В этом случае вы можете опустить путь к файлу и просто назначить имена файлов для чтения/записи. Это будет полезно, если вам нужно будет читать или писать несколько раз, и немного утомительно восстанавливать абсолютный путь к файлу каждый раз. –

Смежные вопросы