R:指定一个字符串作为调用另一个函数的函数的参数

发布于 2024-10-16 20:07:11 字数 374 浏览 7 评论 0原文

这是一个关于 R 编码的问题。

我提供的示例是教学性的。假设我有名为“func1”和“func2”的函数,其中每个函数都有两个参数(假设是标量)。我想指定另一个具有三个参数的函数“applyfunction”:要使用的函数的最后一个数字(“1”或“2”)以及该函数的两个参数。例如,我想做这样的事情(这当然不起作用):

applyfunction(1,2,3) 它将有效地运行 func1(2,3)< /code> 和

applyfunction(2,9,43) ,它将有效运行 func2(9,43)

有什么想法吗?

最好的,数据库

This is a question regarding coding in R.

The example I provide is didactic. Suppose I have functions called 'func1' and 'func2', where each takes two arguments (let's say scalars). I want to specify another function 'applyfunction' that has three args: the last number of the function to use ('1' or '2'), and the two arguments for the function. For example, I want to do something like this (which of course doesn't work):

applyfunction(1,2,3) where it would effectively run func1(2,3) and

applyfunction(2,9,43) where it would effectively run func2(9,43).

Any ideas?

Best, DB

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清晰传感 2024-10-23 20:07:11

您可能想看看do.call(),它使用列表中提供的参数调用函数。围绕这个编写一个完全符合您想要的功能的包装器并不难。

function1=function(a,b)a+b
function2=function(a,b,c)a+b+c

do.call("function1",list(1,2))
do.call("function2",list(1,2,3))

编辑:包装器将是:

applyfunction=function(fun,...)do.call(fun,list(...))

applyfunction("function1",1,2)
applyfunction("function2",1,2,3)

You might want to look at do.call(), which calls a function with arguments supplied in a list. It is not to hard to write a wrapper around this that does exactly what you want.

function1=function(a,b)a+b
function2=function(a,b,c)a+b+c

do.call("function1",list(1,2))
do.call("function2",list(1,2,3))

EDIT: A wrapper would be:

applyfunction=function(fun,...)do.call(fun,list(...))

applyfunction("function1",1,2)
applyfunction("function2",1,2,3)
咽泪装欢 2024-10-23 20:07:11

这是另一种选择。您可以将更多功能添加到switch列表中。

func1 <- function(a, b) a + b
func2 <- function(a, b) a - b
applyfunction <- function(FUN, arg1, arg2) {
  appFun <- switch(FUN,
      func1,  # FUN == 1
      func2,  # FUN == 2
      stop("function ", FUN, " not defined"))  # default
  appFun(arg1, arg2)
}
applyfunction(1,2,3)
# [1] 5
applyfunction(2,9,43)
# [1] -34
applyfunction(3,9,43)
# Error in applyfunction(3, 9, 43) : function 3 not defined

Here's another alternative. You can add more functions to the switch list.

func1 <- function(a, b) a + b
func2 <- function(a, b) a - b
applyfunction <- function(FUN, arg1, arg2) {
  appFun <- switch(FUN,
      func1,  # FUN == 1
      func2,  # FUN == 2
      stop("function ", FUN, " not defined"))  # default
  appFun(arg1, arg2)
}
applyfunction(1,2,3)
# [1] 5
applyfunction(2,9,43)
# [1] -34
applyfunction(3,9,43)
# Error in applyfunction(3, 9, 43) : function 3 not defined
自此以后,行同陌路 2024-10-23 20:07:11

如果您确实希望“通过数字”完成:

> applyfunction=function(n,a,b){get(paste("func",n,sep=""))(a,b)}
> func1=function(a,b){a+b}
> func2=function(a,b){a*b}
> applyfunction(1,4,3)
[1] 7
> applyfunction(2,4,3)
[1] 12

使用 get 和 Paste 来获取与名称关联的函数。

If you really want it done 'by the numbers':

> applyfunction=function(n,a,b){get(paste("func",n,sep=""))(a,b)}
> func1=function(a,b){a+b}
> func2=function(a,b){a*b}
> applyfunction(1,4,3)
[1] 7
> applyfunction(2,4,3)
[1] 12

Uses get and paste to get the function associated with a name.

蓦然回首 2024-10-23 20:07:11

使用函数变量之一作为开关怎么样?

func1 <- function(x,y,z) { 
## Function One stuff goes here
if (x == 1) { 
var1 <- 1 
} 
## Function Two stuff goes here 
if (x == 2) { 
var1 <- 2 
}
return(var1)
} 

并且,您可以使用相同的函数,开关是变量“x”:

> func1(1,1,1)
[1] 1
> func1(2,1,1)
[1] 2

What about using one of the functions variables as a switch?

func1 <- function(x,y,z) { 
## Function One stuff goes here
if (x == 1) { 
var1 <- 1 
} 
## Function Two stuff goes here 
if (x == 2) { 
var1 <- 2 
}
return(var1)
} 

And, you get to use the same function, with the switch being the variable "x":

> func1(1,1,1)
[1] 1
> func1(2,1,1)
[1] 2
月牙弯弯 2024-10-23 20:07:11

这是切换或粘贴的替代方法,只需使用索引从列表中选择:

 function1=function(a,b) a+b
 function2=function(a,b,c) a*b
 applyfunc <- function(n, aa, bb){ c(function1, function2)[[n]](aa,bb) }
 applyfunc(1, 4, 3)
 # [1] 7
 applyfunc(2, 4, 3)
 #[1] 12
 applyfunc(3, 4, 3)
# Error in c(function1, function2)[[n]] : subscript out of bounds

Here an alternate to switch or paste, just use indexing to select from a list:

 function1=function(a,b) a+b
 function2=function(a,b,c) a*b
 applyfunc <- function(n, aa, bb){ c(function1, function2)[[n]](aa,bb) }
 applyfunc(1, 4, 3)
 # [1] 7
 applyfunc(2, 4, 3)
 #[1] 12
 applyfunc(3, 4, 3)
# Error in c(function1, function2)[[n]] : subscript out of bounds
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文