我尝试执行自我定义功能,并遇到一些问题。谁能指导我?
样本数据
df
可以通过以下代码构建:df<-structure(list(ID = c(1, 1, 1, 1, 1, 2, 2, 2), Length = c(4,
7, 8, 33, NA, 4, 88, 9), Score = c(23, 56, 59, 88, 0, 67, 3,
NA)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-8L))
我试图做一些非常简单的事情。只是为了获得最小的长度并得分,无论ID和ID如何。这种充满活力的目的是更好地理解
function()
。
我的代码如下:
simple_cal <- function(data, var1, var2, by_var=NULL) {
min1 <-min(var1, na.rm=T)
min2 <- min(var2, na.rm=T)
df2 <- data %>%
group_by(by_var) %>%
mutate (min3=min(var1))
}
simple_cal(data=df1, var1=Length, var2= Score, by_var=ID)
请赦免我的愚蠢代码。请告诉我您将如何做?
UP前线:写作功能是一回事,写作功能使用NSE(非标准评估)可能很困难...如果您对R代码的能力不太自信,我建议尝试做NSE会像“推开绳索”一样令人满意(闭上眼睛,而不是低于您)。
min1
,
min2
和df2
)。 Since you're using
dplyr
in the function, I'll stick with the simpler {{ .. }}
notation as described in https://dplyr.tidyverse.org/articles/programming.html, I strongly urge you to read more of that page, and about NSE in general at
http://adv-r.had.co.nz/Computing-on-the-language.html.
simple_cal <- function(data, var1, var2, by_var=NULL) {
min1 <- summarize(data, a = min({{ var1 }}, na.rm = TRUE)) |> pull(a)
min2 <- summarize(data, a = min({{ var2 }}, na.rm = TRUE)) |> pull(a)
df2 <- data |>
group_by({{ by_var }}) |>
mutate(min3 = min({{ var1 }}))
}
(此功能正在返回df2
,因此您可以看到它在做某事。您需要与min1
和
min2
一起做某事才能证明它有效。它确实如此。我不喜欢
summarize() |> pull()
步骤,但它使其与您的变量的NSE一起工作,使功能保持一致,并且一致性可维护性。NSE可以维持疼痛。
Aaside:我一般同意弗里德(Friede)认为掩盖基础功能是一种不好的做法。通常,问题不一定是此功能,但是如果您将顶级数据定义为名为data
的变量。为什么?因为如果您在脚本中间重新启动R和拾取,那么exists("data")
将是正确的,使您相信数据是完整的,而实际上,许多在帧上的操作将返回默默无闻的错误,例如invalid 'type' (symbol) of argument
no applicable method for ... to an object of class "function"
,如果错误是像
data
的那样,您可能会暗示您在这种情况下可能会暗示您在这种情况下确实引用了todationd for Plocationd datat formand datatssets。