列出列表而不重新键入对象名称

时间:2018-07-28 09:39:18

标签: r

我有一个函数,其输出是一个列表。对于我正在编写的程序包,用户将使用此功能创建许多列表。这些列表的创建顺序确实很重要。问题是:我需要这些列表的列表,并且顺序正确(创建对象的顺序),而且我不想让用户再次声明列表对象。我想做的事情如下:

# 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起作用?有什么建议么?谢谢!

2 个答案:

答案 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"