我有一个函数,其输出是一个列表。对于我正在编写的程序包,用户将使用此功能创建许多列表。这些列表的创建顺序确实很重要。问题是:我需要这些列表的列表,并且顺序正确(创建对象的顺序),而且我不想让用户再次声明列表对象。我想做的事情如下:
# Approach 1
list_of_lists <- list(
m1 <- function_that_makes_list(arg1, arg2)
m2 <- function_that_makes_list( arg3, arg4)
m3 <- function_that_makes_list( arg5, arg6)
)
所以这等同于以下内容(显然可以,但是涉及到必须重新键入m1,m2,m3,这是我不想要的):
m1 <- function_that_makes_list(arg1, arg2)
m2 <- function_that_makes_list(arg3, arg4)
m3 <- function_that_makes_list(arg5, arg6)
list_of_lists <- list(m1, m2, m3)
如何使方法1起作用?有什么建议么?谢谢!
答案 0 :(得分:1)
我可能会误解您的问题,但是这里有两种方法假设您的最终用户动态创建这些函数调用,即您不知道何时创建列表以及创建多少列表:
# toyfunction:
funlist <- function(){
return(list(rnorm(1)) )
}
funlist()
# [[1]]
# [1] 0.8481468
这避免了重新输入名称:
globallist <- list()
globallist["m1"] <- funlist()
globallist["m2"] <- funlist()
globallist["m3"] <- funlist()
globallist
# $`m1`
# [1] -0.5160049
# $m2
# [1] 0.793974
# $m3
# [1] 0.06070436
这避免了重新键入代码并跟踪正确的顺序:
globallist <- list()
wrap <- function(){
n <- length(globallist)
globallist[n+1] <<- funlist() # change "n+1" if you need different names for the list elements
}
globallist
# list()
wrap()
globallist
# [[1]]
# [1] -1.626766
wrap()
globallist
# [[1]]
# [1] -1.626766
# [[2]]
# [1] -0.2278807
请注意,每次连续调用wrap
时,都会将funlist
的结果附加(作为全局列表的最后一个元素)作为函数调用的副作用。通常仅在知道要执行的操作时才建议从函数内修改全局对象。
答案 1 :(得分:1)
您的选项1需要逗号(见下文)。
这是一个返回列表的函数
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
现在让我们用逗号尝试选项1 [有效]。
fx <- function() {return(list())}
现在让我们创建一个命名列表(它也可以使用)。
list(m1 <- fx(), m2 <- fx(), m3 <- fx()) # your option 1
# [[1]]
# list()
# [[2]]
# list()
# [[3]]
# list()
这具有可以通过编程方式访问名称的优点。
list(m1=fx(), m2=fx(), m3=fx())
# $m1
# list()
# $m2
# list()
# $m3
# list()
您的第二个选择
nestedList <- list(m1=fx(), m2=fx(), m3=fx())
names(nestedList)
# [1] "m1" "m2" "m3"