2016-08-03 80 views
1

我有一個函數f <- function(x){x}。我要插入的行x <- 2*xf,使得它作爲如何將表達式插入到函數體中R

function(x){ 
    x <- 2*x 
    x 
} 

我明白,我應該使用body()結束了,但我迄今只找到瞭如何更換整個身體,這是不符合我的真實目的。

+0

@ZheyuanLi李這是我不清楚我如何使用編輯做到這一點... – BioBroo

+0

@ZheyuanLi - 因爲有一個'\'體< - \''函數,可能有一種方法可以通過編程來實現。 – thelatemail

+0

@ZheyuanLi,我不認爲像'fix'或'edit'這樣的命令會對我有用,因爲我試圖將行插入_any_函數,而不是一個特定的函數。 – BioBroo

回答

1
f <- function(x) { x } 
bdy <- deparse(body(f)) 
body(f) <- as.expression(parse(text=paste0(c(bdy[1], "x <- 2*x", bdy[2:3]), collapse="\n"))) 

知道你真的想要做什麼,像這樣的猴子修補功能聽起來不太好。

+0

我正在努力的一項小任務是將特定的代碼行作爲第一行代碼添加到任意函數中。我這樣做的原因是並行處理沒有函數parMapply,所以我不得不修改用戶定義的函數來使我適合parApply,這很麻煩,並促進錯誤。所以我正在爲parApply寫一個小包裝,這需要我解決我提出的問題。 – BioBroo

+1

我不認爲''parallel :: clusterMap'可以從'parMapply'中得到你想要的,是嗎? –

+0

據我所知,'clusterMap'只適用於Linux和Mac操作系統。我正在使用Windows。 – BioBroo

2

這裏的(使用magrittr精簡的東西)

f <- function(x){x} 
f(2) 
# [1] 2 
# library(magrittr) 
body(f) <- body(f) %>% as.list %>% append(quote(x<-2*x), 1) %>% as.call 
f(2) 
# [1] 4 

甚至乾脆

body(f) %<>% as.list %>% append(quote(x<-2*x), 1) %>% as.call %>% as.expression 

另一種方式,但我覺得我可以連接更簡單的方法來缺少

你可以寫一個更傳統的功能,沒有magrittr以及...

funins <- function(f, expr = expression(x<-2*x), after=1) { 
    body(f)<-as.call(append(as.list(body(f)), expr, after=after)) 
    f 
} 

,您可以使用插入任何表達

f <- function(x){x} 
g <- funins(f, expression(print("hi"), x<-3*x)) 
f(2) 
# [1] 2 
g(2) 
# [1] "hi" 
# [1] 6 
+0

不錯,我在這裏學到了一些技巧+1 –

3

這裏是作爲一個答案我的意見。如果在其他保護的情況下,這是一個單行fuunction:

f <- function(x){x} 


fun <- f 

bod <- body(fun) 
if (trimws(as.character(bod[[1]])) == "{"){ 
    body(fun)[[2]] <- quote(x <- 2*x) 
    if (length(bod) > 1) body(fun)[3:(1+length(bod))] <- bod[-1] 
} else { 
    body(fun)[[1]] <- as.name('{') 
    body(fun)[[2]] <- quote(x <- 2*x) 
    body(fun)[[3]] <- bod 
} 
fun 
fun(3)