Редактировать функцию в R используя замену со строкой в ​​качестве аргумента - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь отредактировать функцию с использованием функций body и substitute в R. Я хочу построить новую строку для функции из строки и после этого подставить ее в функцию.

Полагаю, мне нужно преобразовать строку в определенный класс, который substitute может вычислить и передать в функцию.Но как мне это сделать?

Ниже приведен пример того, что я хочу:

myFun <- function(x) {
    A1 <- 1
    A2 <- 10
    A1 <- x^2 + A2  # Line to be changed
    return(A1 + A2)
}

n <- 2
m <- 1
express_string <- paste0("A", n, " <- x^2 + A", m)

body(myFun)[[4]] <- substitute( express_string )  # This is the tricky part.

Вот как я хочу, чтобы функция выглядела в конце:

myFun <- function(x) {
    A1 <- 1
    A2 <- 10
    A2 <- x^2 + A1  # New line
    return(A1 + A2)
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Просто используйте parse:

body(myFun)[[4]] <- parse(text = express_string)[[1]]

Конечно, было бы предпочтительнее не создавать команду R в виде строк.bquote Может быть полезно:

LHS <- as.name(paste0("A", n))
RHS <- as.name(paste0("A", m))

express <- bquote(.(LHS) <- x^2 + .(RHS))

body(myFun)[[4]] <- express 
0 голосов
/ 07 февраля 2019

Мы можем разобрать выражение

body(myFun)[[4]] <- rlang::parse_expr(express_string)    
myFun
#function (x) 
#{
#    A1 <- 1
#    A2 <- 10
#    A2 <- x^2 + A1
#    return(A1 + A2)
#}
...