在R

时间:2018-08-08 11:00:07

标签: r function dataframe arguments

如何编写带有df和变量参数的函数,同时对它们进行评估?我阅读了r-blogger的几篇文章和博客文章,我认为我对惰性评估存在一些问题,但是现在我非常困惑。

这是我的功能:

    RAM_char_func <- function(dataset, char_var){

      a <- dataset[ , c("id", char_var)]

      b <- a[[id]][is.na(a[[char_var]]) %in% FALSE]

      c <- a[a[[id]] %in% b , ]

      c


}

我明白了:

  

警告   未知或未初始化的列:“ char_var”。

这应该给我一个具有两列并基于char_var n-amount行的表(c)。虽然代码可以在函数外部运行,但我无法设法使其在函数内部运行。我还尝试了使用select和filter的tidyverse-idea,但这也行不通。

我在Mac OS X(High Sierra,10.13.6)和R Studio(最新版本)上使用R 3.5.1。

数据框

df <- data.frame(id = c(1:10),
                          var_10 = c(101:110),
                          var_25 = c("a", "b", NA, "c", NA, "d", NA, "e", "f", NA),stringsAsFactors = F)
df

该函数之外的代码是:

a <- df[ , c("id", "v_25")]
a

b <- a$id[is.na(a$v_25) %in% FALSE]
b

c <- a[a$id %in% b , ]
c

library(tidyverse)
df %>%
select(id, var_25) %>%
filter(is.na(var_25) %in% FALSE)

3 个答案:

答案 0 :(得分:1)

本着“教人如何钓鱼”的精神,您可以使用reprex软件包来确保在干净的环境中运行错误代码,并且错误非常明显(您可以只要您没有凌乱的Rprofile文件,也可以在新会话中运行代码):

library(reprex)
reprex({
df <- data.frame(id = c(1:10),
                 var_10 = c(101:110),
                 var_25 = c("a", "b", NA, "c", NA, "d", NA, "e", "f", NA),stringsAsFactors = F)


RAM_char_func <- function(dataset, char_var){

  a <- dataset[ , c("id", char_var)]

  b <- a[[id]][is.na(a[[char_var]]) %in% FALSE]

  c <- a[a[[id]] %in% b , ]

  c
}
RAM_char_func(df,"var_25")
})

如果使用Rstudio,它将在“查看器”选项卡中显示输出,而我得到的错误是:

  

>如果(is.matrix(i))as.matrix(x)[[i]] else(.subset2(x,:objet'id'introuvable)

(对不起,法国人)

它告诉您找不到对象id,然后您可以检查代码为何尝试访问名为id的对象,然后在第二条指令中容易发现错误您的功能。

如果发现对您来说行不通的错误,请尝试在错误发生后立即运行traceback()或先致电debugonce(RAM_char_func),然后再致电RAM_char_func(df,"var_25"),然后浏览直到找到失败的行。

答案 1 :(得分:0)

这是解决问题的一种方法:

library(tidyverse)
library(rlang)

remove.na <- function(data, col){
    symcol <- enquo(col)
    data %>% select(id, !!symcol) %>% filter(!is.na(!!symcol))
}

df %>% remove.na(var_25)
#   id var_25
# 1  1      a
# 2  2      b
# 3  4      c
# 4  6      d
# 5  8      e
# 6  9      f

all_equal(df %>% select(id, var_25) %>% filter(!is.na(var_25)), df %>% remove.na(var_25))
[1] TRUE

答案 2 :(得分:0)

您的函数包含错误。 [[id]]必须为[["id"]]

RAM_char_func <- function(dataset, char_var){

    a <- dataset[ , c("id", char_var)]

    b <- a[["id"]][is.na(a[[char_var]]) %in% FALSE]

    c <- a[a[["id"]] %in% b , ]

    c
}

数据:

df <- data.frame(id = c(1:10),
                          var_10 = c(101:110),
                          var_25 = c("a", "b", NA, "c", NA, "d", NA, "e", "f", NA),stringsAsFactors = F)

调用函数:

RAM_char_func(dataset=df,char_var="var_25")

#  id var_25
#1  1      a
#2  2      b
#4  4      c
#6  6      d
#8  8      e
#9  9      f