R:如何简洁地为矢量参数组件指定名称?

时间:2014-08-29 11:10:54

标签: r function

我想在R中定义一个函数,如下所示:

testfunction <- function(vector){

adam <- vector[1]

becky <- vector[2]

charlie <- vector[3]

david <- vector[4]

...

return( adam + becky^2 -2*charlie*david +...)

}

我可以纯粹根据&#34; vector [1],vector [2]&#34;来定义函数。等等,但是我想按照“亚当,贝琪&#34;等问题是我的输入向量参数非常大,我必须定义这样的多个函数。我希望能够做一些像定义矢量

的事情
names <- c(adam,becky,charlie,...)

然后把

names <- vector

在每个函数的定义中,但当然这不起作用。有没有人对如何以简洁的方式为输入向量组件分配名称有任何好的建议,可以多次使用?

跟进(2014年10月9日):

我实际上需要这个函数的结果才能生存,所以我可能需要.Global环境;我不确定。我想将函数的名称赋值部分与其余部分分开(因为它实际上很长 - 我在这里编辑了它 - 我想把它插入到多个函数中一个子程序)。我想写的是这些:

function1 <- function(vector, names){

for (i in 1:length(vector){

  assign(names[i], vector[,i], envir = environment())
}

}

function2 <- function(vector){

 function1(vector,names1)

 return( adam + becky^2 - 2*charlie*david +...)

 }

问题是作业不能在function1的环境之外生存,因此function2不会识别&#34; adam&#34;当我试着打电话给那些名字的时候。如何调整环境以照顾它? 感谢。

3 个答案:

答案 0 :(得分:1)

尝试:

v1 <- 1:4
names1 <- c("adam", "becky", "charlie", "david")

testfunction <- function(vect, names){
for(i in seq_along(names)){
assign(names[i], vect[i], envir=.GlobalEnv)
}
return(adam + becky^2 -2*charlie*david)
}

testfunction(v1, names1)
#[1] -19

更新

.GlobalEnv更改为environment(),您可以在本地执行assign

testfunction <- function(vect, names){ 
for(i in seq_along(names1)){
assign(names1[i], vect[i],environment())
}
return(adam + becky^2 - 2*charlie*david)
}

testfunction(v1, names1)
#[1] -19
adam
#Error: object 'adam' not found

答案 1 :(得分:1)

也许在do.call的帮助下:

testfunction <- function(adam, becky, charlie, david) {
  ...
}

do.call(testfunction, as.list(vector))

向量值向参数的分布发生在do.call

Roland的免责声明也适用于此 - 这是一种相当脆弱的方法。为什么不首先使用命名向量或列表?

答案 2 :(得分:0)

我不推荐它,但你可以这样做:

testfunction <- function(vector){
  names(vector) <-  c("adam", "becky", "charlie", "david")
  list2env(as.list(vector), envir = environment())

  adam + becky^2 -2*charlie*david 
}
testfunction(1:4)
#[1] -19

如果它破了你就得保留好碎片。