R中类似于Python星号解包的功能是什么?

7

我在R中有一个例程可以接受可变数量的参数,我需要调用这个例程并传递一个解压缩的列表。在Python中,我会进行如下操作:

lst = [1,2,3]
my_func(*lst)

在R中,等效的语法是什么?

更具体地说,我正在使用shiny,并尝试创建一个动态条目列表。

这是代码。

server <- function(input, output) {
  applist <- c(
      a(href="#", class="list-group-item", 
        h4(class="list-group-item-heading", "Entry 1"),
        p(class="list-group-item-text", "Description")
      ),
      a(href="#", class="list-group-item", 
        h4(class="list-group-item-heading", "Entry 2"),
        p(class="list-group-item-text", "Description")
      ))
   
  output$applist = renderUI(
    div(class="list-group", ... applist)
  )
}

2
你可以使用三个点 ... 并传递任意数量的参数,但是在 R 中没有 ** 的字典。这将是相同的方式。 - akrun
2
你是在使用 div(class="list-group", ... applist) 吗?还是我以为你有一个函数。如果这是一个函数的参数,也许你需要使用 do.call("functionname", arguments_to_function_in_a_list) - akrun
7
您可以使用 do.call(fun, list_of_args)(基本 R)。或尝试这个(tidyverse)。 - IceCreamToucan
1
我没有将其作为答案发布,因为当l <- list(x = 1, y = 2, z = 3)时,这个可以工作`f <- function(x, y, z){ x + y + z };do.call(f, l)但这个不行f <- function(...){ x + y + z };do.call(f, l)而我认为后者是这个问题的关键。不确定是否有一种方法可以修改使其工作。您可以通过在定义的第一行添加inputs <- list(...)并使用inputs $ x`等来修改函数,但也许有更简单的方法? - IceCreamToucan
2
@StefanoBorini 在这里,您提供了一个向量即c(...)。对于列表,它是list(...),但是您可以使用as.list(c(...))将向量转换为列表。 - akrun
显示剩余3条评论
1个回答

1

作者:OP

以下是我的解决方法。使用do.call可以达到效果,但需要注意的是,在Python中的列表与R中的列表不同。R中的列表更类似于字典和列表的混合体。

  applist <- list(
      class="list-group",
      a(href="#", class="list-group-item"),
      a(href="#", class="list-group-item")
  )

  output$applist = renderUI(do.call(div, applist))

请注意,应用列表中包含命名条目class和非命名条目。正如我所说的,这是混合型的。然后do.call执行“解包”,但是应用列表的内容随后被分发为命名或非命名参数。 它与Python的工作方式不同,其中命名和非命名始终是分开的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接