如何编写带有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)
答案 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