簡體   English   中英

用於構建鏈接到分析的 R 包的 Makefile

[英]Makefile for building an R package linked to an analysis

假設我有一個項目,我已經為其開發了一個 R 包。 層次結構可能看起來像這樣。

/project
---Makefile
---workflow.R
---test.R
---/mypackage
    ---DESCRIPTION
    ---NAMESPACE
    ---/R
        ---func1.R
        ---func2.R

workflow.R mypackage取決於正在安裝的最新版本的mypackage 但是,如果包中的任何文件已被修改,我只想重新構建包。

目前,在我的 Makefile 中,我有:

PACKAGE=$(wildcard mypackage/**/*)

all: install test workflow

install: $(PACKAGE)
    R CMD INSTALL mypackage

workflow: install
    Rscript workflow.R

test: install
    Rscript test.R

但是,每次運行make test時,這都會重新安裝包,即使包內沒有任何更改。 有沒有干凈的方法來避免這種情況?

install規則不會在當前目錄中創建名為install的文件,因此每次都會嘗試重新制作它。 這看起來應該是一個.PHONY目標,但它本身並不能解決問題,因為它仍然會執行配方。

一種解決方案是使用另一個規則來創建存根文件:

.PHONY: all install test workflow

all: install test workflow

install: install.done
install.done: $(PACKAGE)
    R CMD INSTALL mypackage
    touch $@

或者您可以只install存根文件本身並使其成為非.PHONY規則。

聽起來您想將安裝視為中間步驟。 您可以通過添加來做到這一點

.INTERMEDIATE: install

到你的makefile。

制作手冊解釋( 鏈接):

如果一個普通文件 b 不存在,並且 make 考慮一個依賴於 b 的目標,它總是創建 b,然后從 b 更新目標。 但是如果 b 是一個中間文件,那么 make 可以很好地保持原樣。 它不會更新 b 或最終目標,除非 b 的某些先決條件比該目標更新或有其他原因更新該目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM