在R函数中追加元素列表

时间:2014-04-24 19:39:45

标签: r list append

我是R的新手,试图编写一个函数来将元素添加到列表中。

以下是函数varNames的代码。我可以使用varNames("name1")调用它,但"name1"未添加到"listNames"(这仍然是一个空列表)。

我一直在尝试一些事情,并且长时间寻找答案,却没有成功。

还尝试lappend,但没有成功。

listNames<-list()

varNames<- function(name){

  listNames <- c(listNames, name)

}

2 个答案:

答案 0 :(得分:1)

问题在于范围。函数中的listNames是该函数的本地函数。从本质上讲,它与您想要更改的listNames不同。

有几种方法可以解决这个问题:

  1. listNames的值更改为函数varNames()的输出:

    listNames <- varNames(name)
    
  2. 使用<<-get()更改外部范围中listNames的值。这通常是一个坏主意,因为它使debuggin 非常很难。

  3. 首先不要封装c()功能。

答案 1 :(得分:1)

R是一种函数式语言,通常意味着您将对象传递给函数,并且这些函数会返回一些对象,您可以根据需要将其返回。所以,你想要的结果是这样的函数:

varNames <- function(existinglist, itemtoadd){
    returnvalue <- c(existinglist, itemtoadd)
    return(returnvalue)
}

listNames <- list()
a <- 'a'
varNames(existinglist = listNames, itemtoadd = a)

如果要将原始listNames对象替换为函数的返回值,则需要将其分配给该原始对象的名称:

listNames
listNames <- varNames(existinglist = listNames, itemtoadd = a)
listNames

您最初编写代码的方式是R新手的常见错误。您试图创建所谓的&#34;副作用&#34;。也就是说,您希望在不使用listNames分配的情况下修改原始<-对象。这通常被认为是不好的做法,R中产生副作用的功能相对较少。

为了更好地理解这一点,您可能会发现the R Introduction on scopeon assignment within functions以及Circle 6 of R Inferno都很有帮助。