字符串作为R

时间:2018-06-19 15:55:42

标签: r string function arguments

数据框chocolates列出了糖果的类型和每种糖果的一组评分:

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

我正在编写一个函数,该函数接受文件名的参数,特定类型的糖果的ID以及我感兴趣的分数({sweetnessfilling或{{ 1}}),并为该文件中的某种糖果返回一定的分数。例如,如果我想要crash个“昵称”的sweetness等级(如下面的语法)...

ID

...某些函数> 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的任何想法?

1 个答案:

答案 0 :(得分:2)

这是一个有效的示例:

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

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)
}