【问题标题】:create dataframes and column names using R equivalent of python *args使用 R 等效于 python *args 创建数据框和列名
【发布时间】:2021-10-12 07:41:56
【问题描述】:

我了解到,在 R 中,您可以使用 ... 将可变数量的参数传递给您的函数

我现在正在尝试创建一个函数并循环通过...,例如创建一个数据框。

    create_df <- function(...) {
      for(i in ...){
        ... <- data.frame(...=c(1,2,3,4),column2=c(1,2,3,4))
      }
    }

create_df(hello,world)

我想使用此代码创建两个数据框,一个名为 hello,另一个名为 world。其中一列也应分别命名为helloworld。谢谢

这是我的错误:

Error in create_df(hello, there) : '...' used in an incorrect context

【问题讨论】:

  • R 中的函数旨在返回值。通常,他们不应该将变量添加到调用范围。这违反了函数式编程的原则。有许多选项可以从此处获取 ... 中的值名称:stackoverflow.com/questions/51259346/…。但重要的是要了解 R 期望字符与符号时的区别以及评估哪些符号而哪些不评估。目前,这似乎不是一个非常类似于 R 的函数,这可能是它难以开始工作的原因。

标签: r


【解决方案1】:

函数将变量注入其调用环境通常不是一个好主意。最好从函数返回值并将相关值保存在列表中。在这种情况下,您可以改为这样做

create_df <- function(...) {
  names <- sapply(match.call(expand.dots = FALSE)$..., deparse)
  Map(function(x) {
    setNames(data.frame(a1=c(1,2,3,4),a2=c(1,2,3,4)), c(x, "column2"))
  }, names)
}

create_df(hello,world)
# $hello
#   hello column2
# 1     1       1
# 2     2       2
# 3     3       3
# 4     4       4

# $world
#   world column2
# 1     1       1
# 2     2       2
# 3     3       3
# 4     4       4

这将返回一个命名列表,它在 R 中更易于使用。我们使用 match.call... 名称转换为字符串,然后将这些字符串与期望它们的函数一起使用,例如 setNames() 来更改数据。框架列名称。 Map 也是生成列表的好帮手。使用地图风格的函数通常比使用显式的 for 循环更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多