我不确定这是否可行(至少我试图这样做的方式),但我真的希望如此。我有一个相当复杂的测试环境,我在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而不是手动输入对高阶函数的调用这将是相当长的,容易出现人为错误。一般来说,弄清楚如何实现我上面列出的内容将极大地帮助我的发展,所以任何输入都将非常感激。谢谢!
答案 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