我有一個函數f <- function(x){x}
。我要插入的行x <- 2*x
爲f
,使得它作爲如何將表達式插入到函數體中R
function(x){
x <- 2*x
x
}
我明白,我應該使用body()
結束了,但我迄今只找到瞭如何更換整個身體,這是不符合我的真實目的。
我有一個函數f <- function(x){x}
。我要插入的行x <- 2*x
爲f
,使得它作爲如何將表達式插入到函數體中R
function(x){
x <- 2*x
x
}
我明白,我應該使用body()
結束了,但我迄今只找到瞭如何更換整個身體,這是不符合我的真實目的。
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")))
知道你真的想要做什麼,像這樣的猴子修補功能聽起來不太好。
這裏的(使用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
不錯,我在這裏學到了一些技巧+1 –
這裏是作爲一個答案我的意見。如果在其他保護的情況下,這是一個單行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)
@ZheyuanLi李這是我不清楚我如何使用編輯做到這一點... – BioBroo
@ZheyuanLi - 因爲有一個'\'體< - \''函數,可能有一種方法可以通過編程來實現。 – thelatemail
@ZheyuanLi,我不認爲像'fix'或'edit'這樣的命令會對我有用,因爲我試圖將行插入_any_函數,而不是一個特定的函數。 – BioBroo