我是R的新手,试图编写一个函数来将元素添加到列表中。
以下是函数varNames的代码。我可以使用varNames("name1")
调用它,但"name1"
未添加到"listNames"
(这仍然是一个空列表)。
我一直在尝试一些事情,并且长时间寻找答案,却没有成功。
还尝试lappend
,但没有成功。
listNames<-list()
varNames<- function(name){
listNames <- c(listNames, name)
}
答案 0 :(得分:1)
问题在于范围。函数中的listNames
是该函数的本地函数。从本质上讲,它与您想要更改的listNames
不同。
有几种方法可以解决这个问题:
将listNames
的值更改为函数varNames()
的输出:
listNames <- varNames(name)
使用<<-
和get()
更改外部范围中listNames
的值。这通常是一个坏主意,因为它使debuggin 非常很难。
首先不要封装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 scope和on assignment within functions以及Circle 6 of R Inferno都很有帮助。