2017-06-30 24 views
0

我正在编写围绕rBayesianOptimizationcaret R包的包装函数。下面描述的问题是主包装函数内部步骤的一部分。我需要将特定模型的超参数(以下代表input)传递给将在高斯过程模型中采样的函数。超参数当前存储在一个字符向量中。R函数使用字符向量动态生成另一个R函数

有没有办法使用字符向量在R中动态生成函数?我需要一个实际上创建另一个函数的函数。例如,

# start with this... 
input <- c("a","b") 

# ...and an intermediate function generates this 
test_function <- function(a=a,b=b) { 
    d <- data.frame(a=a,b=b) 
} 

此外,解决方案需要能够处理各种长度和内容的输入。所以像这样的东西也应该工作,

# start with this... 
input <- c("c","d","e","f") 

# ...and an intermediate function generates this 
test_function <- function(c=c,d=d,e=e,f=f) { 
    d <- data.frame(c=c,d=d,e=e,f=f) 
} 

这是一个玩具的例子,但它足以回答我的问题。

回答

1

如果我理解你的问题吧,你要寻找的是创建了一个函数的函数,其中第二个函数接受参数与名称为input(给第一个功能)和价值,也许数字,由这些论点标记。如果这是正确的,那么这个怎么样?

create_fun <- function(input) { 
    funargs <- paste(input, collapse=', ') 
    dfargs <- paste0(input, '=', input, collapse=', ') 
    funstr <- paste0(
    sprintf("function(%s) {", funargs), 
    sprintf("data.frame(%s)", dfargs), 
    "}") 
    eval(parse(text=funstr)) 
} 
# example applications: 
create_fun(c('a','b'))(a=1, b=8) 
## a b 
## 1 1 8 
create_fun(c('x','y','z'))(y=1, z=8, x=4) 
## x y z 
## 1 4 1 8 
+0

这是完美的。我更新了我的原始问题以澄清 –

1

这是您发布的简单示例的简单答案。这听起来像你真正的工作可能需要更复杂的方法,但这可能有帮助。我相信还有其他的方法可以更快地做到这一点。

input <- c("c","d","e","f") 

test_function <- function(inputVec) { 
    df <- data.frame(inputVec[1], stringsAsFactors = FALSE) 
    names(df)[1] <- inputVec[1] 
    if(length(inputVec) == 1) { 
    return(df) 
    } 
    else if(length(inputVec) > 1) { 
    for(i in seq(2, length(inputVec), 1)) { 
     dfNew <- data.frame(inputVec[i], stringsAsFactors = FALSE) 
     names(dfNew) <- inputVec[i] 
     df <- dplyr::bind_cols(df, dfNew) 
    } 
    return(df) 
    } 
} 

testDF <- test_function(inputVec = input) 

print(testDF) 
## c d e f 
##1 c d e f 
+0

这是做我所问的(因此+1),但我意识到我没有问我在原来的问题到底是什么意思。 @pangia的回应是我想到的。我编辑了我的问题来反映这一点。 –