R:使用用户输入将函数和参数作为参数传递给高阶函数

时间:2015-12-08 01:31:18

标签: r functional-programming higher-order-functions

我不确定这是否可行(至少我试图这样做的方式),但我真的希望如此。我有一个相当复杂的测试环境,我在R中开发,如果我可以将函数及其相关参数作为参数传递给高阶函数,那将会非常有用。我可以在不要求用户输入的情况下轻松完成此操作,但readline()导致字符串的事实使得我尝试做的事情有点棘手。这是一个简化版本(请注意,我假设参数输入的数值,但实际上,我在我的实际代码中进行错误检查数据类型。这只是简化以获得重点):

read_in <- function(){
    temp_nm <- readline(prompt = paste("Enter the name of parameter: "))
    temp_vlu <- as.numeric(readline(prompt = paste("Enter the value for ",temp_nm,": ")))
    assign(temp_nm,temp_vlu,envir = .GlobalEnv)
    temp_param <- as.name(temp_nm)
    temp_params <- list(temp_param)
    return(temp_params)
}

我知道这不起作用,因为它返回以下内容:

> read_in()
Enter the name of parameter: this_param
Enter the value for  this_param : 12
[[1]]
this_param

这很接近,因为它确实在全局环境中为this_param赋值12,但我真的希望返回

> read_in()
Enter the name of parameter: this_param
Enter the value for  this_param : 12    
[[1]]
this_param = 12

所以我可以将this_param = 12作为参数传递给另一个高阶函数(除了this_param作为参数的实际函数)。同样,与我实际尝试的相比,这是非常简单的,它将一系列函数和相关参数作为高阶函数的参数传递,同时使用UI而不是手动输入对高阶函数的调用这将是相当长的,容易出现人为错误。一般来说,弄清楚如何实现我上面列出的内容将极大地帮助我的发展,所以任何输入都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

使用do.call可以将命名列表传递给函数

read_in <- function() {
  temp_nm <- readline(prompt = paste("Enter the name of parameter: "))
  temp_vlu <- as.numeric(readline(prompt = paste("Enter the value for ",temp_nm,": ")))
  setNames(list(temp_vlu), temp_nm)
}

f <- function(x, y, some_param) {
  some_param
}

out <- read_in()
# Enter the name of parameter: some_param
# Enter the value for  some_param : 12
# some_param 
#         12 

do.call('f', out)
# [1] 12