2014-10-09 51 views
4

Python有這個方便構建體:我可以告訴R腳本是否在littler下運行?

def do_stuff(): 
    whatever 
if __name__ == "__main__": 
    do_stuff(() 

使得如果文件是從與python foo.py./foo.py和適當shebang行的命令行運行,則__name__變量被設置爲__main__和文件運行作爲腳本。但是,您也可以從交互式shell或其他Python代碼執行from foo import do_stuff,然後從那裏運行do_stuff。然後,相同的腳本文件將充當模塊而不是腳本。

我可以在littler腳本中做類似的事嗎?喜歡的東西foo.R之中:

#!/bin/env r 
do_stuff = function(){ 
    whatever 
} 
if(?run as r command_line?){ 
do_stuff() 
} 

然後,我可以source("foo.R")這將定義do_stuff(在我的默認全局環境,但我們會掩蓋了,對於一個位)。

一個可能的關鍵是在littler(設置爲腳本名稱)下運行時在環境中存在_,但稍微強一點可能會更好。

+0

從http://dirk.eddelbuettel.com/code/littler/README:*「利特勒通過指定腳本參數的‘ARGV’矢量提供了方便和把它放到全球環境中,這是一個慣例,其次是其他流行的腳本語言。'*。也許你可以檢查'argv'的存在嗎? – Andrie 2014-10-09 12:03:15

回答

3

像這樣的東西應該工作:

#!/usr/local/bin/r --vanilla 

doStuff <- function(print_me) { 
    print(print_me) 
} 

if (!interactive()) { 
    if (exists("argv")) { 
    if (!is.null(argv) && length(argv)>0) { 
     doStuff(argv[1]) 
    } 
    } 
} 
+0

看起來一樣好,我們會得到。最裏面的'if'實際上是''argv'對'doStuff'正確的檢查,而不是腳本在'littler'下運行的測試的一部分。如果你在你的函數中使用'argv'作爲全局函數,並且你需要在你的調用代碼中設置它,這也會中斷,但這可能是一個壞主意。由於'__file__'是由加載程序設置的模塊級變量,因此它很難在Python中打破這種模式。 – Spacedman 2014-10-12 08:10:46

相關問題