Çalışma dizinini Rstudio'da kaynak dosya konumuna ayarlamak için R komutu


135

R'de bazı öğreticiler üzerinde çalışıyorum. Her R kodu belirli bir klasörde bulunur. İçinde veri dosyaları ve başka dosyalar var. Açmak istiyorum.rDosyayı aşağıda gösterildiği gibi Rstudio'daki çalışma dizinini değiştirmem gerekmeyecek şekilde kaynak yapmak istiyorum:

görüntü açıklamasını buraya girin

Çalışma dizinimi otomatik olarak R'de belirtmenin bir yolu var mı?


Bu muhtemelen bir dupe. bkz?setwd ?getwd
Brandon Bertelsen


3
Bir dupe değil, poster loadaynı klasördeki .rdata-dosyalarını istiyor source, çalışma dizini kaynaklı dosyanın yoluna ayarlı değil .
Ruben

Yanıtlar:


76

Kaynak alınan bir komut dosyasının konumunu öğrenmek için utils::getSrcDirectoryveya kullanabilirsiniz utils::getSrcFilename. Böylece, çalışma dizinini mevcut dosyanınkiyle değiştirmek şu şekilde yapılabilir:

setwd(getSrcDirectory()[1])

Kodu Kaynaklamak yerine Çalıştırırsanız , RStudio'da bu çalışmaz . Bunun için kullanmanız gerekiyor .rstudioapi::getActiveDocumentContext

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

Bu ikinci çözüm, elbette IDE'niz olarak RStudio'yu kullanmanızı gerektirir.


stackoverflow.com/a/35842176/1247080 adresindeki kendi cevabınız işe yarıyor (yine de dizin adını içermelidir). Ben ekledim
Stat-R

Benim için çalışmıyor. AnladımError: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'
Andru

2
getActiveDocumentContext()RStudio içinde konsolda çalıştırdığınızda , yolun olarak bildirildiğini unutmayın ''. Ancak, editör kısmında kod satırını çalıştırırsanız, beklendiği gibi çalışacaktır. Bu, @Andru'nun yorumuna yönelik olabilir
Megatron

1
@giac_man Paketin çok eski bir sürümünü kullanıyormuşsunuz gibi görünüyor rstudioapi. En son sürüme güncellemeyi deneyin.
Richie Cotton

1
@mjs Konsolun üst kısmında mevcut çalışma dizinini görmelisiniz. Bunun sağında küçük bir ok var. Dosya tarayıcısında mevcut çalışma dizinini göstermek için buna tıklayın.
Richie Cotton

62

Bu sorunun modası geçmiş olduğunu biliyorum, ancak bunun için de bir çözüm arıyordum ve Google bunu en üstte listeliyor:

this.dir <- dirname(parent.frame(2)$ofile)
setwd(this.dir)

bunu dosyanın bir yerine koyun (en iyisi başlangıçtır), böylece wd o dosyaya göre değişir.

Yorumlara göre, bu her platformda mutlaka çalışmayabilir (Windows çalışıyor gibi görünüyor, bazıları için Linux / Mac). Bu çözümün dosyalara 'kaynak sağlamak' için olduğunu, bu dosyadaki yığınları çalıştırmak için gerekli olmadığını unutmayın.

ayrıca `kaynak`d dosyasının dosya adını ve yolunu alma konusuna bakın


99
benim için de çalışmadı:Error in dirname(parent.frame(2)$ofile) : a character vector argument expected
tumultous_rooster

4
Linux'ta @Matt O'Brien ile aynı problem.
patapouf_ai

3
Kaynaklıysa mükemmel çalışıyor.
m-dz

2
Windows 10'da RStudio v1.0.143'te benim için çalıştı. "Kaydederken Kaynak" ı seçerseniz, gayet iyi çalışacaktır (algılanan dizini "cat" ile yazdırabilirsiniz). Satırları seçip çalıştırırsanız, sonuç boştur.
Contango

2
Bu, bir dosya kaynağı oluştururken benim için Mac'te çalışıyor. Bununla birlikte, @Contango'nun yukarıda işaret ettiği gibi, bir parçayı vurgulayarak ve Command + Return tuşlarına basarak kodu etkileşimli olarak yürütürken çalışmayacaktır. Bu durumda, bir dosya kaynağı sağlamadığınız için, çalışma dizinini çekeceğiniz kaynak dosya yoktur. Yanıtın platforma özgü uyarıları belirtmesi gerekmez.
bmosov01

7
dirname(rstudioapi::getActiveDocumentContext()$path)

benim için çalışıyor ancak rstudioapi'yi kullanmak istemiyorsanız ve bir projede değilseniz, yolunuzda ~ sembolünü kullanabilirsiniz. ~ Sembolü, varsayılan RStudio çalışma dizinini ifade eder (en azından Windows'ta).

RStudio seçenekleri

RStudio çalışma dizininiz "D: / Documents" ise, setwd("~/proyect1") ise, setwd ("D: / Documents / proyect1") ile aynıdır.

Bunu belirledikten sonra, bir alt dizinin gidebilirsiniz: read.csv("DATA/mydata.csv"). İle aynıdır read.csv("D:/Documents/proyect1/DATA/mydata.csv").

Bir ana klasöre gitmek istiyorsanız, kullanabilirsiniz "../". Örneğin: read.csv("../olddata/DATA/mydata.csv")hangisi aynıread.csv("D:/Documents/oldata/DATA/mydata.csv")

Hangi bilgisayarı kullanıyor olursanız olun, komut dosyalarını kodlamanın en iyi yolu budur.



6

İçin rstudio , otomatik kullanarak komut dizinine çalışma dizinini ayarlayabilirsiniz rstudioapi böyle:

library(rstudioapi)

# Getting the path of your current open file
current_path = rstudioapi::getActiveDocumentContext()$path 
setwd(dirname(current_path ))
print( getwd() )

Bu, dosyanızı Çalıştırırken veya Kaynak Oluştururken çalışır.

Önce rstudioapi paketini kurmanız gerekir. Doğru yerde olduğumdan% 100 emin olmak için yolu yazdırdığıma dikkat edin, ancak bu isteğe bağlıdır.


Setwd (dirname (geçerli_path)) hatası: çalışma dizini değiştirilemez
tavalendo

@helmo, kullanıcınızın hedef dizine yazma izni olup olmadığını kontrol edin.
gagarine

5

Çözüm

dirname(parent.frame(2)$ofile)

benim için çalışmıyor.

Bir kaba kuvvet algoritması kullanıyorum ama işe yarıyor:

File <- "filename"
Files <- list.files(path=file.path("~"),recursive=T,include.dirs=T)
Path.file <- names(unlist(sapply(Files,grep,pattern=File))[1])
Dir.wd <- dirname(Path.file)

Bir dizini ararken daha kolay:

Dirname <- "subdir_name"
Dirs <- list.dirs(path=file.path("~"),recursive=T)
dir_wd <- names(unlist(sapply(Dirs,grep,pattern=Dirname))[1])

1
Bu çözümle ilgili sorun, çok yavaş olmasıdır. Tüm dosyaları aramak ve bir değişkende saklamak da çok fazla bellek kullanır.
tavalendo

4

Linux üzerinde çalışıyorsanız, şunu deneyebilirsiniz:

setwd(system("pwd", intern = T) )

Benim için çalışıyor.


1
Bu sadece ana dizininizi (kabuğunuzun başladığı yer) verir.
Caner

Çalıştırdığınız betiğin bulunduğu dizine yol verir.
Taz

2
pwd, mevcut çalışma dizini anlamına gelir. Bu, dizini kabuğun mevcut dizini ne olursa olsun ayarlayacaktır.
PeterVermont

pwdayrıca PowerShell'de (şu anda Windows'ta varsayılan kabuk olarak kabul edilir) çalışır, burada Get-Location.
BroVic

3

Bu soruna bir çözüm arıyordum, bu sayfaya geldim. Eski olduğunu biliyorum, ancak tatmin edici olmayan veya benim için işe yaramayan önceki çözümler. İlgileniyorsanız işte benim çalışmam.

filename = "your_file.R"
filepath = file.choose()  # browse and select your_file.R in the window
dir = substr(filepath, 1, nchar(filepath)-nchar(filename))
setwd(dir)

Sadece kullanmamanın bir nedeni var mı setwd( dirname(filepath) )?
jodis

3

Bunun eski bir iş parçacığı olduğunun farkındayım, ancak çalışma dizinini ayarlama gereksinimi ile benzer bir sorun yaşadım ve benim için işe yarayacak çözümlerden hiçbirini alamadım. Daha sonra başka birinin buna rastlaması durumunda işe yarayan şudur:

# SET WORKING DIRECTORY TO CURRENT DIRECTORY:
system("pwd=`pwd`; $pwd 2> dummyfile.txt")
dir <- fread("dummyfile.txt")
n<- colnames(dir)[2]
n2 <- substr(n, 1, nchar(n)-1)
setwd(n2)

Biraz kıvrımlıdır, ancak temelde bu, çalışma dizinini almak ve dummyfile.txt'ye kaydetmek için sistem komutlarını kullanır, ardından R, bu dosyayı data.table :: fread kullanarak okur. Gerisi sadece dosyaya yazdırılanları temizlemek, böylece sadece dizin yolunu bırakmam.

R'yi bir kümede çalıştırmam gerekiyordu, bu yüzden hangi dizine gireceğimi bilmenin bir yolu yoktu (işlere bir numara ve bir hesaplama düğümü atanır). Bu benim için hile yaptı.


2

Bunun modası geçmiş olduğunu anlıyorum, ancak eski cevapları çok tatmin edici bir şekilde işe alamadım, bu yüzden BumbleBee'nin cevabına yapılan yorumlarda belirtilen aynı hatayla başka birinin karşılaşması durumunda yöntemime katkıda bulunmak istedim.

Benimki basit bir sistem komutuna dayanıyor. İşlevi beslediğiniz tek şey, komut dosyanızın adıdır:

extractRootDir <- function(x) {
    abs <- suppressWarnings(system(paste("find ./ -name",x), wait=T, intern=T, ignore.stderr=T))[1];
    path <- paste("~",substr(abs, 3, length(strsplit(abs,"")[[1]])),sep="");
    ret <- gsub(x, "", path);
    return(ret);
}

setwd(extractRootDir("myScript.R"));

İşlevin çıktısı şöyle görünecektir "/Users/you/Path/To/Script". Umarım bu, takılıp kalmış olabilecek herkese yardımcı olur.


1

herepaket sağlarhere() bazı tahminlere dayalı proje kök dizinini döndüren işlevi.

Senaryonun yerini bulamadığı için mükemmel bir çözüm değil, ama bazı amaçlar için yeterli, bu yüzden buraya koyayım dedim.


1
Bu cevap için teşekkürler. Geçerli betiğin konumu here::set_here(), kaynağa bir çağrı yapılarak kullanılabilir.
BroVic

0

Çoğu GUI, bir dizindeyseniz ve bir .R dosyasını "açarsanız", çift tıklatırsanız veya başka bir şekilde çalıştırmaya çalışırsanız, aksi belirtilmedikçe, içinde bulunduğu dizinin çalışma dizini olacağını varsayar. Mac GUI, çalışan bir oturumda ayarladığınız Tercihler Başlangıç ​​panelinde değiştirilebilen ve bir sonraki "başlangıçta" etkili olan bu varsayılan davranışı değiştirmek için bir yöntem sağlar. Ayrıca şunlara da bakmalısınız:

?Startup

RStudio belgeleri şunları söylüyor:

"Bir dosya ilişkilendirmesi aracılığıyla başlatıldığında, RStudio çalışma dizinini otomatik olarak açılan dosyanın dizinine ayarlar." Varsayılan kurulum, RStudio'nun .R dosyaları için bir işleyici olarak kaydedilmesidir, ancak .Rdata ve .R uzantıları için RStudio ile varsayılan bir "ilişkilendirme" ayarlama yeteneğinden de bahsedilir. Linux'ta 'işleyici' ve 'ilişkilendirme' statüsünün aynı olup olmadığını anlayamıyorum.

http://www.rstudio.com/ide/docs/using/workspaces


4
Elbette RStudio bu varsayımı yapmıyor.
nico

1
Makinemde anlattığım gibi davranıyor. RStudio Tercihlerine özel bir şey yapmadım.
IRTFM

2
Bunu Linux'ta yapmaz :)
nico

2
"Bir dosya ilişkilendirmesi aracılığıyla başlatıldığında" buradaki temel koşuldur. Bazı insanlar terminaldeki bir kısayol veya komutla Rstudio'yu başlatıyor olabilir. Dosyayı açmanız ve .R dosyalarını açmak için varsayılanın Rstudio olması gerekir. Önce Rstudio'yu açarsanız (ardından dosyayı açarsanız), açıklandığı gibi çalışmayacaktır. Bir dosya ilişkilendirmesi aracılığıyla, yukarıdaki yanıt Windows ve Mac'te çalışır (@nico'nun işaret ettiği gibi muhtemelen linux değil - ancak bir linux makinem olmadığı için bunu doğrulayamıyorum).
WetlabStudent

0
dirname(parent.frame(2)$ofile)  

benim için de çalışmıyor, ancak aşağıdakiler ( https://stackoverflow.com/a/35842176/992088'de önerildiği gibi ) ubuntu 14.04'te benim için çalışıyor

dirname(rstudioapi::getActiveDocumentContext()$path)

1
Error: 'getActiveDocumentContext' is not an exported object from 'namespace:rstudioapi'ayrıca Ubuntu 14.04'te
Rich Scriven

Belki önce rstudioapi paketini kurmayı deneyebilirsiniz.
Lamothy

Bu garip. 32-bit ubuntu 14.04'te R-3.2.4 kullanıyorum. Bunun nedeni, işletim sistemi veya R. farklı sürümlerini değil umut
Lamothy

0

UTF-8 kodlamasını kullanmanız durumunda:

path <- rstudioapi::getActiveDocumentContext()$path
Encoding(path) <- "UTF-8"
setwd(dirname(path))

Henüz yapmadıysanız rstudioapi paketini kurmanız gerekir.


Setwd (dizin adı (yol)) hatası: çalışma dizini değiştirilemiyor
tavalendo

`` Setwd (dizin adı (yol)) hatası: çalışma dizini değiştirilemiyor '' çözümünüz çalışmıyor, lütfen cevabınızı kontrol edin
Mr S Coder

0

İşte bunu yapmanın başka bir yolu:

set2 <- function(name=NULL) {
  wd <- rstudioapi::getSourceEditorContext()$path
  if (!is.null(name)) {
    if (substr(name, nchar(name) - 1, nchar(name)) != '.R') 
      name <- paste0(name, '.R')
  }
  else {
    name <- stringr::word(wd, -1, sep='/')
  }
  wd <- gsub(wd, pattern=paste0('/', name), replacement = '')
  no_print <- eval(expr=setwd(wd), envir = .GlobalEnv)
}
set2()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.