【问题标题】:string as function argument in R字符串作为R中的函数参数
【发布时间】:2018-11-28 15:47:26
【问题描述】:

Dataframe chocolates 列出了糖果的类型和每种糖果的一组评级:

ID          sweetness   filling   crash
snickers    0.67        0.55      0.40
milky_way   0.81        0.53      0.56
...

我正在编写一个函数,它接受文件名的参数、特定类型糖果的 ID 和我感兴趣的分数(sweetnessfillingcrash)并返回该文件中特定糖果的特定分数。例如,如果我想要ID“snickers”的sweetness 评级(如下文所示)......

> chocolates$sweetness[chocolates$ID=="snickers"]
[1] 0.67

...一些函数candyranks(data=, ID=, score=) 应该返回相同的值。这是我写的:

candyranks <- function(data, id, score){
  data$score[chocolates$ID=="snickers"]
}

但是candyranks(data=chocolates, ID = "snickers", score = sweetness) 返回值NULL。我已经确定 ID 是一个字符向量。关于为什么它不会返回 0.67 值的任何想法?

【问题讨论】:

  • 在函数内部使用[[而不是$,即data[[score]][chocolates$ID == "snickers"]

标签: r string function arguments


【解决方案1】:

这是一个工作示例:

首先让我们定义一个可重现的数据框:

chocolate <- data.frame(ID = c("snickers", "milky_way"),
                        sweetness = c(0.67, 0.81),
                        filling = c(0.55, 0.55),
                        crash = c(0.40, 0.56))

现在我们要确保我们的所有参数不被视为列名,而是对象调用。我们还想在适当的时候使用我们的函数参数来给函数更多的灵活性:

candyranks <- function(data, id, score){
  data[[score]][data$ID==id]
}

在此示例中,它更灵活一些,因为它不需要将数据集称为 chocolate。给我们以下内容:

candyranks(data = chocolate, id = "snickers", score = "sweetness")
[1] 0.67

替代dplyr 方法:

虽然基本R 非常适合这种情况,但我知道有些人更喜欢dplyr 语法来逐行查看正在发生的事情。对于此数据集,以下应该完全按照上述方式执行,但使用 tidyverse 措辞:

candyranks <- function(data, id, score){
  require(dplyr)
  data %>% 
    filter(ID == id) %>% 
    pull(score)
}

【讨论】: