2013-05-10 39 views
6

Phương pháp đa nền tảng để tìm thư mục tạm thời của hệ điều hành từ bên trong R là gì? Tôi hiện đang sử dụng:Đọc hệ thống TMP dir trong R

dirname(tempdir()) 

Công việc nào cả trên Ubuntu và Windows từ trong một phiên R tương tác. Tuy nhiên, sau đó nó thất bại khi được gọi từ bên trong RApache. Trong RApache giá trị của tempdir() luôn là /tmp, vì vậy dirname(tempdir()) kết quả trong /, điều này rõ ràng là sai. Tôi cũng đã thử:

Sys.getenv("TMP") 
Sys.getenv("TEMP") 
Sys.getenv("TMPDIR") 

như đề xuất bởi ?"environment variables" nhưng không có điều nào trong số này được đặt trong Ubuntu. Nó cũng không có vẻ được đặt trong bất kỳ tập tin nào trong /etc/R/* vì vậy tôi không hoàn toàn hiểu cách R phát hiện giá trị này.

+0

Tại sao 'tempdir()' luôn trả về '/ tmp' là khó hiểu. Bạn có quyền ghi vào thư mục đó không? – flodel

+0

Tôi nghĩ rằng rApache đặt mức C toàn cục 'R_TempDir' để thực hiện một số bộ nhớ đệm. Xem https://github.com/jeffreyhorner/rapache – Jeroen

Trả lời

1

Biến môi trường "TMPDIR", "TMP" và "TEMP" có thể được sử dụng để sửa đổi giá trị trả về tempdir() nếu biến C R_TempDir không được đặt (mặc dù tôi không chắc chắn cách thực hiện) . Nếu bạn muốn có một chức năng cross-nền tảng đó sẽ trở lại con đường của một thư mục tmp hợp lý, và không quan tâm đến giá trị của R_TempDir, bạn có thể sử dụng một cái gì đó như thế này:

gettmpdir <- function() { 
    tm <- Sys.getenv(c('TMPDIR', 'TMP', 'TEMP')) 
    d <- which(file.info(tm)$isdir & file.access(tm, 2) == 0) 
    if (length(d) > 0) 
    tm[[d[1]]] 
    else if (.Platform$OS.type == 'windows') 
    Sys.getenv('R_USER') 
    else 
    '/tmp' 
} 

này được dựa trên chức năng InitTempDir trong tệp src/main/sysutils.c từ bản phân phối nguồn R, được dịch từ C sang R.

Các vấn đề liên quan