এক্সিকিউটিভ স্ক্রিপ্টের পথ নির্ধারণ করুন


255

আমার কাছে একটি স্ক্রিপ্ট foo.Rরয়েছে যার মধ্যে অন্য একটি স্ক্রিপ্ট রয়েছে other.Rযা একই ডিরেক্টরিতে রয়েছে:

#!/usr/bin/env Rscript
message("Hello")
source("other.R")

তবে আমি এটি সন্ধান Rকরতে চাই যে other.Rবর্তমান ওয়ার্কিং ডিরেক্টরিটি যাই হোক না কেন।

অন্য কথায়, foo.Rএর নিজস্ব পথ জানা দরকার। আমি এটা কিভাবে করবো?


2
নং :( আমি আসলে এমন কোনও সমাধান দেখিনি যা বাস্তবে কাজ করে। কেবলমাত্র ডিরেক্টরিটি পাস করার জন্য বা পরিবেশের ভেরিয়েবল ব্যবহার করার জন্য workaround ছাড়াও
ফ্রাঙ্ক

3
এমনকি স্ক্রিপ্টগুলি সম্পূর্ণ পোর্টেবল এবং এমনকি আর নিউওফাইটস দ্বারা নির্বাহযোগ্য করা আশ্চর্যজনক হবে!
এটিয়েন লো-ডিকারি

4
সমস্ত উত্তরগুলির মতোই এটি প্রদর্শিত হয় যা আপনাকে কোনও সময়ে পথ অন্তর্ভুক্ত করতে হবে (অন্তত ফাইলটি উত্স করতে)! এটি দুর্দান্ত হবে যদি আপনি কাউকে একটি সংকুচিত ফোল্ডারটি পাঠাতে পারেন এবং সেই ফোল্ডারটির মধ্যে যে কোনও আর স্ক্রিপ্ট ফাইল চালানো সেই ফোল্ডারটি থেকে পড়তে পারে এবং সেটিকে সংরক্ষণ করতে পারে।
এটিয়েন লো-ডিকারি

10
এই একক ইস্যু আসলে Te কারণে আমি পুরোপুরি পাইথন সরাতে পারে হতে পারে
Giacomo,

5
@ গিয়াক_ম্যান, আমার মনে হয় আর এই ধরণের শত শত ক্ষুদ্র সমস্যা রয়েছে যা এগুলি সমস্ত কাজ করা খুব কঠিন করে তোলে
মাইকেল বার্টন

উত্তর:


102

এখানে সমস্যার সহজ সমাধান রয়েছে। এই আদেশ:

script.dir <- dirname(sys.frame(1)$ofile)

বর্তমান স্ক্রিপ্ট ফাইলের পথ ফেরত দেয়। স্ক্রিপ্টটি সংরক্ষণ করার পরে এটি কাজ করে।


4
এটি আমার পক্ষে কাজ করে না। আমি উইন্ডোজে আর চালাই। কোন ধারণা?
এহসান 88

4
একই ত্রুটি পেয়েছে, একটি সংরক্ষিত স্ক্রিপ্ট সহ এবং নতুনভাবে ইনস্টল করে উইন্ডোতে আর 3.2.0 চালান ...
রাল্ফবি

27
আপনি যখন dirname(sys.frame(1)$ofile)রাস্তুডিও থেকে সরাসরি চালানোর চেষ্টা করবেন তখন এই ত্রুটি ঘটে । এটা ঠিক আছে কাজ করে স্ক্রিপ্ট উৎস ( "other.R") ব্যবহার মৃত্যুদন্ড কার্যকর করা হয়, এবং dirname(sys.frame(1)$ofile)ভিতরে "other.R"
মুর্তা

4
আরএসসিপি.এক্সে অর্থাত্ উত্স () ব্যবহার না করে স্ক্রিপ্ট হিসাবে কল করার সময় আমি 'স্ট্যাকের অনেকগুলি ফ্রেম নয়' ত্রুটি পেয়েছি। সুতরাং এর পরিবর্তে আমাকে নীচের প্রেসারিংফায়ার থেকে সমাধানটি ব্যবহার করতে হয়েছিল
মার্ক অ্যাডামসন

3
NULLসার্ভারে রাখলে আমি জেল করি sh চকচকে ব্যবহার করার সময়
পল

75

আপনি commandArgsপ্রকৃত আর অনুবাদককে রুপলিপি দ্বারা পাস করা সমস্ত বিকল্প পেতে এবং সেগুলি অনুসন্ধান করতে ফাংশনটি ব্যবহার করতে পারেন --file=। আপনার স্ক্রিপ্টটি যদি পথ থেকে চালু করা হয় বা এটি একটি পুরো পাথ দিয়ে চালু করা হয়, script.nameনীচে একটি দিয়ে শুরু হবে '/'। অন্যথায়, এটি অবশ্যই আপেক্ষিক হতে পারে cwdএবং পুরো পথটি পেতে আপনি দুটি পথ একসাথে করতে পারেন।

সম্পাদনা: দেখে মনে হচ্ছে আপনার কেবল script.nameউপরের প্রয়োজন হবে এবং পথের চূড়ান্ত উপাদানটি সরিয়ে ফেলতে হবে। আমি অপ্রয়োজনীয় cwd()নমুনা সরিয়েছি এবং মূল স্ক্রিপ্টটি পরিষ্কার করেছি এবং আমার পোস্ট করেছি other.R। কেবল এই স্ক্রিপ্ট এবং other.Rস্ক্রিপ্টটিকে একই ডিরেক্টরিতে সেভ chmod +xকরুন, সেগুলি এবং মূল স্ক্রিপ্টটি চালান।

প্রধান.আর :

#!/usr/bin/env Rscript
initial.options <- commandArgs(trailingOnly = FALSE)
file.arg.name <- "--file="
script.name <- sub(file.arg.name, "", initial.options[grep(file.arg.name, initial.options)])
script.basename <- dirname(script.name)
other.name <- file.path(script.basename, "other.R")
print(paste("Sourcing",other.name,"from",script.name))
source(other.name)

other.R :

print("hello")

আউটপুট :

burner@firefighter:~$ main.R
[1] "Sourcing /home/burner/bin/other.R from /home/burner/bin/main.R"
[1] "hello"
burner@firefighter:~$ bin/main.R
[1] "Sourcing bin/other.R from bin/main.R"
[1] "hello"
burner@firefighter:~$ cd bin
burner@firefighter:~/bin$ main.R
[1] "Sourcing ./other.R from ./main.R"
[1] "hello"

আমি বিশ্বাস করি এটিই দেহমান খুঁজছেন।


ডাউনমডের সাথে কী আছে?
দমনকারী

2
আমি নিম্নচাপিত হয়েছি কারণ আপনার প্রযুক্তিটি sourceযেমন কাজ করে না ভেবেছিল ওপি চায় তেমন কাজ করে না - তবে সম্ভবত আমি তার প্রয়োজনীয়তাটি ভুলভাবে লিখেছি। কিন্তু আমি না আন-downmod করতে পারেন :( দুঃখিত!
হ্যাডলি

তবে প্রকৃতপক্ষে, এটি উত্স দিয়ে কাজ করে! কেবল উত্স (other.name) এবং এটি সঠিকভাবে কাজ করে।
দমনকারী ফায়ার 0

3
পাথ কনটেনটেশনের জন্য, ব্যবহার করা আরও ভালother.name <- file.path(script.basename, "other.R")
জেসন

1
আমি যখন চালানোর চেষ্টা commandArgs(trailingOnly = FALSE)একটি উজ্জ্বল অ্যাপ্লিকেশনে server.R ভিতরে, আমি পেতে [1] "RStudio" "--interactive"। যে ডিরেক্টরি থেকে এটি আহ্বান করা হয়েছিল সে সম্পর্কে কোনও তথ্য নেই।
পল

57

আর কনসোল থেকে 'উত্স' দেওয়ার সময় আমি সপ্রেসিংফায়ারের সমাধান কাজ করতে পারি না।
স্ক্রিপ্ট ব্যবহার করার সময় আমি কাজ করার জন্য হ্যাডির সমাধান পেতে পারি না।

দুই ভুবনের সেরা?

thisFile <- function() {
        cmdArgs <- commandArgs(trailingOnly = FALSE)
        needle <- "--file="
        match <- grep(needle, cmdArgs)
        if (length(match) > 0) {
                # Rscript
                return(normalizePath(sub(needle, "", cmdArgs[match])))
        } else {
                # 'source'd via R console
                return(normalizePath(sys.frames()[[1]]$ofile))
        }
}

6
আমি এটি পছন্দ করি কারণ এটি উভয়ের সাথে Rscriptএবং source()আর এর মধ্যেই কাজ normalizePath()করে I'd
wch

1
এটিই কেবল কাজ করেছিল। দ্রষ্টব্য, এটি কাজ করার জন্য library(base)আমাকে কিছুটা সময় নিয়েছিল তা বুঝতে পেরে গেল
ও.আরকা

2
আপনি স্যার আমার ভোট পান, কারণ এটিই আমার জন্য কাজ করা সমাধান
ভিনস ডব্লু

1
আমরা যে কেউকে সহায়তা করেন, তাহলে মূল পোস্টের জন্য, যে অর্থ হবে source(file.path(dirname(thisFile()), "other.R"))মধ্যে foo.R। এটি আমার পক্ষে কাজ করে।
কিম

একটি ইস্যু। ধরুন আরস্টুডিও আইতে উত্সটি main.Rকোন উত্সগুলি helper.Rকল করে thisFile()। এটি এর main.Rপরিবর্তে পথ আনবে helper.R। এখানে কোন টিপস?
ওয়াসাদামো

37
frame_files <- lapply(sys.frames(), function(x) x$ofile)
frame_files <- Filter(Negate(is.null), frame_files)
PATH <- dirname(frame_files[[length(frame_files)]])

যদিও এটি কাজ করে আমাকে জিজ্ঞাসা করবেন না, কারণ আমি ভুলে গেছি: /


2
কোন প্রসঙ্গে কাজ করে? মুদ্রণ (sys.frames ()) আমি যখন এটি চালাব তখন নূলে যায়।
দমনকারী

1
@ সাপ্রেসিংফায়ার: sys.framesকল স্ট্যাকের পরিবেশগুলি ফিরিয়ে দেয়, তাই কোনও ফাংশন থেকে ডেকে এলে তা সত্যই বোধগম্য হয়। চেষ্টা করুন, যেমন foo <- function() {bar <- function() print(sys.frames()); bar()}; foo(),। আমি @ হ্যাডলির কোডটি বের করতে পারছি না যদিও পরিবেশের ofileসদস্য নেই।
রিচি কটন

1
অর্থাত যদি আমি যে কোড তারপর চালানো সংরক্ষণ - আপনি উৎস করার জন্য ফাইল আছে source("~/code/test.r"), PATHসেট করা হবে ~/desktop। আপনি যদি শীর্ষ স্তরে এটি মূল্যায়ন করেন তবে এটি NULL ফেরত আসবে।
হ্যাডলি

4
এটি আমার প্রশ্নের উত্তর দেয় না। আমাকে স্বয়ংক্রিয়ভাবে "other.R" ফাইলটি সন্ধান করতে হবে। x$ofileঅপরিজ্ঞাত, তাই frame_filesখালি।
ফ্রাঙ্ক 16

@ হডলি, খুব দরকারী কোড। সক্রিয় বিকাশে যখন আমি প্রায় সমস্ত স্ক্রিপ্টগুলিতে যুক্ত করি তবে "পুনরায় লোড করুন বর্তমান স্ক্রিপ্ট" ইউটিলিটি ফাংশনটি সাধারণ করতে সক্ষম হয়েছি। আরএসক্রিপ্ট পুনরায় লোডার
সিম

29

এটি আমার পক্ষে কাজ করে

library(rstudioapi)    
rstudioapi::getActiveDocumentContext()$path

4
আমার ধারণা এটি কেবল আরস্টুডিওর ভিতরে থেকেই কাজ করে। টার্মিনালটি দিয়ে চেষ্টা করছি Error: RStudio not running
ইস্তা

আর স্টুডিওর কোনও আর স্ক্রিপ্ট থেকে চালিত হলে এটি আরও সুনির্দিষ্টভাবে কাজ করে। এমনকি আর স্টুডিওতে কনসোলে এটি ""আমার ক্ষেত্রে সঠিক ফলাফল দেয় না
কেয়ার

26

কোনও আর স্ক্রিপ্টের পথ পাওয়া থেকে রাকেন্সির উত্তরটি সবচেয়ে সঠিক এবং সত্যই উজ্জ্বল আইএমএইচও। তবুও, এটি এখনও একটি ডামি ফাংশন অন্তর্ভুক্ত হ্যাক। এটি অন্যের কাছে আরও সহজলভ্য হওয়ার জন্য আমি এখানে এটি উদ্ধৃত করছি।

উত্সডির <- getSrcDirectory (ফাংশন (ডামি) um ডামি})

এটি স্টেটমেন্টটি যেখানে রাখা হয়েছিল সেখানে ডিরেক্টরিটির ডিরেক্টরি দেয় (যেখানে ডামি ফাংশন সংজ্ঞায়িত করা হয়)। এরপরে এটি কার্যনির্বাহী নির্দেশিকা নির্ধারণ এবং আপেক্ষিক পাথগুলি ব্যবহার করতে ব্যবহার করা যেতে পারে যেমন

setwd(sourceDir)
source("other.R")

বা পরম পাথ তৈরি করতে

 source(paste(sourceDir, "/other.R", sep=""))

1
আমার জন্য, আপনার সমাধানটি সবচেয়ে ভাল ছিল। বিশেষত কারণ এটি চকচকে অ্যাপ্লিকেশনটিতে প্রয়োগ করা যেতে পারে এবং এটি লিঙ্কে নেই।
jcarlos

1
এখানে getSrcDirectory এর ব্যবহারসমূহ :: getSrcDirectory
রুবেলগুনা

5
এটি লিনাক্স / ম্যাকের অধীনে দুর্দান্তভাবে কাজ করতে পারে তবে এটি উইন্ডোজের অধীনে একটি ইন্টারেক্টিভ আরস্টুডিও সেশনে আমার পক্ষে কার্যকর হয়নি। sourceDirফাঁকা ছিল।
কনটাঙ্গো

1
একটি ইন্টারেক্টিভ টার্মিনালে @ কনটাঙ্গো, কোনও পথ নেই !!! আপনি একটি ফাইলের পথ চান।
pommedeterresautee

1
আমি পেয়ে করছি character(0)। পরামর্শ?
অগল্টার

16

আমার সব এক! (--01 / 09/2019 আরস্টুডিও কনসোলের সাথে ডিল করার জন্য আপডেট হয়েছে)

#' current script file (in full path)
#' @description current script file (in full path)
#' @examples
#' works with Rscript, source() or in RStudio Run selection, RStudio Console
#' @export
ez.csf <- function() {
    # http://stackoverflow.com/a/32016824/2292993
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript via command line
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName))
        } else {
            if (!is.null(sys.frames()[[1]]$ofile)) {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
            } else {
                # RStudio Run Selection
                # http://stackoverflow.com/a/35842176/2292993
                pth = rstudioapi::getActiveDocumentContext()$path
                if (pth!='') {
                    return(normalizePath(pth))
                } else {
                    # RStudio Console
                    tryCatch({
                            pth = rstudioapi::getSourceEditorContext()$path
                            pth = normalizePath(pth)
                        }, error = function(e) {
                            # normalizePath('') issues warning/error
                            pth = ''
                        }
                    )
                    return(pth)
                }
            }
        }
    }
}

ইন্টারেক্টিভ আর সেশন নিয়ে কাজ করে না; আমি পাচ্ছি: `` `> উত্স (" সিএসএফ.আর ")> সিএসএফ () ত্রুটি:
আরস্টুডিও

এটা অসাধারণ. কেউ কি প্যাকেজ তৈরি করতে পারেন?
জো ফ্ল্যাক

13

সুপারসিংফায়ারের উত্তরের একটি স্লিমড ডাউন বৈকল্পিক:

source_local <- function(fname){
    argv <- commandArgs(trailingOnly = FALSE)
    base_dir <- dirname(substring(argv[grep("--file=", argv)], 8))
    source(paste(base_dir, fname, sep="/"))
}

এটি পুনরাবৃত্তির সাথে কাজ করে না; I উত্স ফাইলটি একটি ডেটা ফাইলের সন্ধান করে (তবে ভুল ডিরেক্টরিতে)।
আনফুন বিড়াল

11

এটি আমার পক্ষে কাজ করে। কমান্ড লাইন আর্গুমেন্টের বাইরে এটিকে গ্রেপ্ত করে, অযাচিত পাঠ্য কেটে ফেলা হয়, একটি নামকরণ করে এবং শেষ পর্যন্ত এটি থেকে পুরো পথ পায়:

args <- commandArgs(trailingOnly = F)  
scriptPath <- normalizePath(dirname(sub("^--file=", "", args[grep("^--file=", args)])))


6

আমি স্টিমার 25 এর সমাধানটি পছন্দ করেছি কারণ এটি আমার উদ্দেশ্যগুলির পক্ষে সবচেয়ে শক্তিশালী বলে মনে হচ্ছে। তবে, আরস্টুডিওতে (উইন্ডোতে) ডিবাগ করার সময়, পথটি সঠিকভাবে সেট করা যাবে না। কারণটি হ'ল যদি আরস্টুডিওতে কোনও ব্রেকপয়েন্ট সেট করা থাকে তবে ফাইলটি সোর্সিং করে একটি বিকল্প "ডিবাগ উত্স" কমান্ড ব্যবহার করা হয় যা স্ক্রিপ্টের পথটিকে কিছুটা আলাদাভাবে সেট করে। এখানে চূড়ান্ত সংস্করণটি যা আমি বর্তমানে ব্যবহার করছি ডিবাগিংয়ের সময় আরস্টুডিওতে এই বিকল্প আচরণের জন্য কোন অ্যাকাউন্টগুলি:

# @return full path to this script
get_script_path <- function() {
    cmdArgs = commandArgs(trailingOnly = FALSE)
    needle = "--file="
    match = grep(needle, cmdArgs)
    if (length(match) > 0) {
        # Rscript
        return(normalizePath(sub(needle, "", cmdArgs[match])))
    } else {
        ls_vars = ls(sys.frames()[[1]])
        if ("fileName" %in% ls_vars) {
            # Source'd via RStudio
            return(normalizePath(sys.frames()[[1]]$fileName)) 
        } else {
            # Source'd via R console
            return(normalizePath(sys.frames()[[1]]$ofile))
        }
    }
}

রাস্তুডিওতে উত্সটি আমার জন্য অফিল দিয়েছে, তবে ডিবাগসোর্স ফাইলনাম দিয়েছে যাতে আপনার সমাধানটি ভাল কাজ করে তবে কোড মন্তব্যগুলি আমার ক্ষেত্রে একেবারেই সঠিক নয়
মার্ক অ্যাডামসন

6

আমি এই প্রশ্নের থেকে প্রায় সবকিছুই চেষ্টা করেছি, একটি আর স্ক্রিপ্ট পথ পথ , বর্তমান স্ক্রিপ্টের পাথ পান , বর্তমান .R ফাইলের অবস্থান খুঁজুন এবং Rstudio মধ্যে সোর্স ফাইল অবস্থান করার জন্য কাজ ডিরেক্টরি সেট করার জন্য আর কমান্ড , কিন্তু শেষে নিজেই নিজে পাওয়া CRAN টেবিলটি ব্রাউজ করে খুঁজে পেয়েছি

scriptName গ্রন্থাগার

যা current_filename()ফাংশন সরবরাহ করে, যা আরস্টুডিওতে স্যুরস করার সময় এবং আর বা আরএসক্রিপ্টের মাধ্যমে এক্সিকিউটেবলের মাধ্যমে প্রার্থনা করার সময় স্ক্রিপ্টের যথাযথ পূর্ণ পথ ফেরায়।


1
Package ‘scriptName’ was removed from the CRAN repository.- এখন কি? : ও
বোজন পি।

3

আমারও এই সমস্যা ছিল এবং উপরের সমাধানগুলির মধ্যে আমার পক্ষে কোনও কাজ হয়নি। হয়তো sourceবা এর মতো জিনিসগুলির সাথে , তবে এটি যথেষ্ট পরিষ্কার ছিল না।

আমি এটি খুঁজে পেয়েছি, আমার জন্য মার্জিত, সমাধান:

paste0(gsub("\\", "/", fileSnapshot()$path, fixed=TRUE),"/")

এর মধ্যে গুরুত্বপূর্ণ বিষয়টি হ'ল এটি fileSnapshot()আপনাকে কোনও ফাইল সম্পর্কে প্রচুর তথ্য দেয়। এটি 8 টি উপাদানের একটি তালিকা ফেরত দেয়। আপনি যখন pathতালিকার উপাদান হিসাবে বাছাই করবেন , সেই পথটি \\বিভাজক হিসাবে ফিরে আসবে , সুতরাং বাকী কোডটি কেবল এটির পরিবর্তনের জন্য।

আশা করি এটা কাজে লাগবে.


1
এটি আমার জন্য লিনাক্স মেশিনে কাজ করে না; ফাইলটির পাথ ফিরে না আসার পরিবর্তে, আমি বর্তমানে যে ডিরেক্টরিটি ছিলাম তা ফিরে পেয়েছি I আমি কোডের এক লাইনের সাথে TEST.R নামে একটি স্ক্রিপ্ট তৈরি করেছি: মুদ্রণ (ফাইলস্ন্যাপশট () $ পাথ) আমি এটিকে এই ফোল্ডারে সংরক্ষণ করেছি: / অপ্ট / হোম / বুপস / ডেস্কটপ / টেস্টফোল্ডার / টেস্ট.আরআই তখন আমার ডেস্কটপে নেভিগেট করে এবং ফাইলটি চালনার চেষ্টা করে: বুপ @ লিনাক্সভার: ~ / ডেস্কটপ $ রুপলিপি / ওপট / হোম / বোপস / ডেস্কটপ / টেস্টফোল্ডার / টিএসটিআর [1 ] "/ অপ্ট / হোম /
বুপস

আমার পক্ষেও কাজ করেনি। 'এখানে' লাইব্রেরি ব্যবহার করার সময় 'এখানে ()' হিসাবে একই জিনিসটি ফেরত দেয়। এটি আমার বর্তমানে উন্মুক্ত আর প্রকল্পের পথে ফিরে এসেছে, তবে তিনি নিজেই ফাইলটি কার্যকর করেননি।
জো ফ্ল্যাক

2

আপনি বাশ স্ক্রিপ্টে আর স্ক্রিপ্টটি মোড়ানো করতে পারেন এবং স্ক্রিপ্টের পথটিকে ব্যাশ ভেরিয়েবল হিসাবে পুনরুদ্ধার করতে পারেন:

#!/bin/bash
     # [environment variables can be set here]
     path_to_script=$(dirname $0)

     R --slave<<EOF
        source("$path_to_script/other.R")

     EOF

3
এর জন্য আপনার স্ক্রিপ্টের পথ থাকা দরকার। এটি আপনাকে সত্যিকারের পোর্টেবল আর স্ক্রিপ্ট তৈরি করতে দেয় না যা কোথাও থেকে চলতে পারে।
এটিয়েন লো-ডিকারি

@ এটিইনলও-ডেকারি এটির জন্য স্ক্রিপ্টের পথের প্রয়োজন নেই, এটি বাশ থেকে পেয়েছে। মূল বিষয়টি হ'ল এটি পাথ পাওয়ার কোনও নির্ভরযোগ্য উপায় নয়। ভালো কিছু হিসেবে পছন্দ করা হয়, stackoverflow.com/questions/59895/... path_to_script = "$ (সিডি" $ (dirname "$ {BASH_SOURCE [0]}") "&& PWD)"
জন Haberstroh

2

আমি এই পদ্ধতির পছন্দ:

this.file <- sys.frame(tail(grep('source',sys.calls()),n=1))$ofile
this.dir <- dirname(this.file)

2

আমি নিজেই এটি কাজ করেছি। আপনার স্ক্রিপ্টের বহনযোগ্যতা নিশ্চিত করতে সর্বদা এটি দিয়ে শুরু করুন:

wd <- setwd(".")
setwd(wd)

এটি কাজ করে কারণ "।" ইউনিক্স কমান্ড $ পিডাব্লুডির মতো অনুবাদ করে। এই স্ট্রিংটিকে একটি অক্ষর অবজেক্টে বরাদ্দকরণের পরে আপনি সেই চরিত্রের অবজেক্টটি সেটআপড () এ সন্নিবেশ করতে পারবেন এবং প্রিস্টো আপনার কোডটি সর্বদা তার বর্তমান ডিরেক্টরিটি চলমান ডিরেক্টরি হিসাবে চালিত হবে, তা কারও মেশিনে নেই বা ফাইল কাঠামোতে এটি কোথায় আছে তা বিবেচনা করে না matter অবস্থিত। (অতিরিক্ত বোনাস: আপনার নামকৃত ডিরেক্টরিতে নেতৃত্বাধীন ফাইল পাথ নির্বিশেষে স্ট্যান্ডার্ড আউটপুট ডিরেক্টরি তৈরি করার জন্য wd অবজেক্টটি file.path () (যেমন। File.path (wd, "আউটপুট_ডাইরেক্টরি") দিয়ে ব্যবহার করা যেতে পারে। এটি আপনাকে নতুন ডিরেক্টরিটিকে এভাবে উল্লেখ করার আগে তৈরি করতে হবে তবে এটিও, wd অবজেক্টের সাহায্যে করা যেতে পারে।

পর্যায়ক্রমে, নিম্নলিখিত কোডটি ঠিক একই জিনিস সম্পাদন করে:

wd <- getwd()
setwd(wd)

অথবা, যদি কোনও বস্তুতে আপনার যদি ফাইল পাথের প্রয়োজন না হয় তবে আপনি কেবল:

setwd(".")

11
নাঃ। এটি প্রক্রিয়াটির ডিরেক্টরি খুঁজে পায়, ফাইলটি নয়।
ব্যবহারকারী 1071847

এটি ইন্টারস্টিভ মোডে আরস্টুডিও সহ উইন্ডোতে আমার পক্ষে কাজ করেছে।
কনটাঙ্গো

2

নোট করুন যে getopt প্যাকেজটি get_Rscript_filenameফাংশন সরবরাহ করে , যা এখানে উপস্থাপিত একই সমাধান ব্যবহার করে, তবে এটি ইতিমধ্যে আপনার জন্য একটি স্ট্যান্ডার্ড আর মডিউলে লেখা হয়েছে, সুতরাং আপনাকে প্রতিটি স্ক্রিপ্টে "স্ক্রিপ্টের পাথ পান" ফাংশনটি অনুলিপি করতে এবং আটকাতে হবে না তুমি লেখ.


এটি সর্বদা এনএ প্রদান করে, এমনকি যদি আমি কোনও স্ক্রিপ্ট তৈরি করি যা তার আউটপুট প্রিন্ট করে এবং তারপর স্ক্রিপ্টটি কল করে যেমনR -e "library(getopt); testscript.R"
বোকভ

1
ফাংশনটির নাম থেকেই বোঝা যাচ্ছে, আপনার স্ক্রিপ্টটি ব্যবহার করে চালানো দরকার Rscript
রায়ান সি থম্পসন

আহ, উফ! ধন্যবাদ।
বোকভ

1

দেখুন findSourceTraceback()এর R.utils প্যাকেজ, যা

সমস্ত কল ফ্রেমে উত্স () দ্বারা উত্পন্ন সমস্ত 'srcfile' অবজেক্ট সন্ধান করে। এটি বর্তমানে সোর্স () দ্বারা কোন ফাইলগুলি স্ক্রিপ্ট করা আছে তা সন্ধান করা সম্ভব করে।


1

আমার স্ক্রিপ্টটি একটি সিমলিংকড ডিরেক্টরি থেকে পরিচালিত হওয়ায় আমার উপরের বাস্তবায়নগুলি নিয়ে সমস্যা ছিল বা কমপক্ষে সে কারণেই আমি মনে করি যে উপরের সমাধানগুলি আমার পক্ষে কার্যকর হয়নি। @ এন্নুয়াইকিলারের উত্তরের পংক্তিতে আমি আমার রুপলিপিটি ব্যাশে জড়িয়েছি। আমি ব্যবহার করে পাথের ভেরিয়েবল সেট করে রেখেছিpwd -P , যা সিমলিঙ্কযুক্ত ডিরেক্টরি কাঠামো সমাধান করে। তারপরে পথটি স্ক্রিপ্টে প্রবেশ করুন into

Bash.sh

#!/bin/bash

# set path variable
path=`pwd -P`

#Run Rscript with path argument
Rscript foo.R $path

foo.R

args <- commandArgs(trailingOnly=TRUE)
setwd(args[1])
source(other.R)

1

আমি @ স্টিমার 25 এর পদ্ধতির বিভিন্ন রূপ ব্যবহার করব। মুল বক্তব্যটি হ'ল আমি আমার সেশনটি যখন রুপ্রিপ্টের মাধ্যমে শুরু করেছিলাম তখনও আমি শেষ স্রোত স্ক্রিপ্টটি পেতে পছন্দ করি। নিম্নলিখিত স্নিপেট, যখন কোনও ফাইলে অন্তর্ভুক্ত থাকে, তখন thisScriptস্ক্রিপ্টটির স্বাভাবিকীকরণের পথ সহ একটি চলক সরবরাহ করা হবে । আমি সোর্স 'ব্যবহারের (আব) ব্যবহার স্বীকার করি, তাই কখনও কখনও আমি রুপলিপিটি উপস্থাপন করি এবং --fileযুক্তিটিতে সরবরাহিত স্ক্রিপ্টটি অন্য একটি স্ক্রিপ্ট উত্স করে যা অন্য একটিকে ... যেদিন আমি আমার অগোছালো কোডটিকে একটি প্যাকেজে রূপান্তরিত করতে বিনিয়োগ করব।

thisScript <- (function() {
  lastScriptSourced <- tail(unlist(lapply(sys.frames(), function(env) env$ofile)), 1)

  if (is.null(lastScriptSourced)) {
    # No script sourced, checking invocation through Rscript
    cmdArgs <- commandArgs(trailingOnly = FALSE)
    needle <- "--file="
    match <- grep(needle, cmdArgs)
    if (length(match) > 0) {
      return(normalizePath(sub(needle, "", cmdArgs[match]), winslash=.Platform$file.sep, mustWork=TRUE))
    }
  } else {
    # 'source'd via R console
    return(normalizePath(lastScriptSourced, winslash=.Platform$file.sep, mustWork=TRUE))
  }
})()

1

99% ক্ষেত্রে আপনি কেবল ব্যবহার করতে পারেন:

sys.calls()[[1]] [[2]]

এটি ক্রেজিট কলগুলির জন্য কাজ করবে না যেখানে স্ক্রিপ্টটি প্রথম যুক্তি নয়, যেমন source(some args, file="myscript")। এই অভিনব ক্ষেত্রে @ হ্যাডলি ব্যবহার করুন।



1

স্টিমার 25 এর পদ্ধতির কাজ করে তবে কেবল পথে যদি কোনও সাদা জায়গা না থাকে। MacOS উপর অন্তত cmdArgs[match]মত আয় কিছু /base/some~+~dir~+~with~+~whitespace/জন্য /base/some\ dir\ with\ whitespace/

আমি "returning + ~" এর ফিরিয়ে দেওয়ার আগে একটি সাধারণ সাদা জায়গা দিয়ে প্রতিস্থাপন করে এটিকে ঘিরে কাজ করেছি।

thisFile <- function() {
  cmdArgs <- commandArgs(trailingOnly = FALSE)
  needle <- "--file="
  match <- grep(needle, cmdArgs)
  if (length(match) > 0) {
    # Rscript
    path <- cmdArgs[match]
    path <- gsub("\\~\\+\\~", " ", path)
    return(normalizePath(sub(needle, "", path)))
  } else {
    # 'source'd via R console
    return(normalizePath(sys.frames()[[1]]$ofile))
  }
}

স্পষ্টতই আপনি এখনও অন্য ব্লকটি এপ্রস্টারের মতো প্রসারিত করতে পারেন।


1

যদি স্ক্রিপ্টের পরিবর্তে foo.R, এর অবস্থানের অবস্থানটি জেনে আপনি যদি সর্বদা sourceএকটি সাধারণ থেকে সমস্ত ডি পথ উল্লেখ করতে আপনার কোড পরিবর্তন করতে পারেন rootতবে এগুলি দুর্দান্ত সাহায্য হতে পারে:

প্রদত্ত

  • /app/deeply/nested/foo.R
  • /app/other.R

এটি কাজ করবে

#!/usr/bin/env Rscript
library(here)
source(here("other.R"))

প্রকল্পের শিকড়গুলি কীভাবে সংজ্ঞায়িত করতে হয় তা দেখতে https://rprojroot.r-lib.org/ দেখুন ।


আমার জন্য এখানে প্যাকেজটি ঠিক কাজটি করে এবং এটি একটি সহজ সমাধান বলে মনে হয়
রন

0
#!/usr/bin/env Rscript
print("Hello")

# sad workaround but works :(
programDir <- dirname(sys.frame(1)$ofile)
source(paste(programDir,"other.R",sep='/'))
source(paste(programDir,"other-than-other.R",sep='/'))

আমি এখনও ত্রুটিটি পেয়েছি "sys.frame এ ত্রুটি (1): স্ট্যাকের অনেক ফ্রেম নয়"
মাইকেল বার্টন

0

আশ্চর্যজনক আর তে কোনও '$ 0' ধরণের কাঠামো নেই! আপনি এটি সিস্টেমের মাধ্যমে করতে পারবেন () আর-তে লিখিত একটি বাশ স্ক্রিপ্টে কল করুন:

write.table(c("readlink -e $0"), file="scriptpath.sh",col=F, row=F, quote=F)
thisscript <- system("sh scriptpath.sh", intern = TRUE)

তারপরে স্ক্রিপ্টপথ.শ নামটি অন্য.আর এর জন্য আলাদা করুন

splitstr <- rev(strsplit(thisscript, "\\/")[[1]])
otherscript <- paste0(paste(rev(splitstr[2:length(splitstr)]),collapse="/"),"/other.R")

আমি একটি ত্রুটি বার্তা readLink: illegal option -- e usage: readLink [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
পেয়েছি

0

কল স্ট্যাকটি দেখে আমরা প্রতিটি স্ক্রিপ্টের ফাইলপথ কার্যকর করতে পারি, দুটি সর্বাধিক দরকারী দুটি হ'ল হয় হয় বর্তমানে সম্পাদনকারী স্ক্রিপ্ট, অথবা প্রথম স্ক্রিপ্টটি উত্সর্গীকৃত (এন্ট্রি) হবে।

script.dir.executing = (function() return( if(length(sys.parents())==1) getwd() else dirname( Filter(is.character,lapply(rev(sys.frames()),function(x) x$ofile))[[1]] ) ))()

script.dir.entry = (function() return( if(length(sys.parents())==1) getwd() else dirname(sys.frame(1)$ofile) ))()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.