R:使用用户输入将函数和参数作为参数传递给高阶函数
R: Using user input to pass functions and parameters as parameters to 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)
}
我知道这不太管用,因为它 return 如下:
> read_in()
Enter the name of parameter: this_param
Enter the value for this_param : 12
[[1]]
this_param
这很接近,因为它确实在全局环境中将值 12 分配给 this_param,但我真的很期待 return
> 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 而不是手动输入对我的调用高阶函数,它会很长并且容易出现人为错误。总的来说,弄清楚如何实现我上面列出的目标将极大地帮助我的发展,因此我们将不胜感激任何意见。谢谢!
使用 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
我不确定这是否可行(至少我尝试这样做的方式),但我真的希望如此。我在 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)
}
我知道这不太管用,因为它 return 如下:
> read_in()
Enter the name of parameter: this_param
Enter the value for this_param : 12
[[1]]
this_param
这很接近,因为它确实在全局环境中将值 12 分配给 this_param,但我真的很期待 return
> 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 而不是手动输入对我的调用高阶函数,它会很长并且容易出现人为错误。总的来说,弄清楚如何实现我上面列出的目标将极大地帮助我的发展,因此我们将不胜感激任何意见。谢谢!
使用 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