R 将方程作为参数传递到函数中
有人告诉我,将方程作为字符串传递并对其求值是一种糟糕的做法。在没有字符串版本和第三方软件包的情况下,我怎样才能创建一个接受公式并对其求值的函数 这是我的职责:R 将方程作为参数传递到函数中,r,R,有人告诉我,将方程作为字符串传递并对其求值是一种糟糕的做法。在没有字符串版本和第三方软件包的情况下,我怎样才能创建一个接受公式并对其求值的函数 这是我的职责: replaceFormula <- function(df, column, formula){ df[column] <- eval(parse(text=formula), df) return(df) } replaceFactor <- function(df, column, condition, w
replaceFormula <- function(df, column, formula){
df[column] <- eval(parse(text=formula), df)
return(df)
}
replaceFactor <- function(df, column, condition, what){
df[column] <- sapply(df[column],function(x) ifelse(eval(parse(text=condition), df), what, x))
return(df)
}
replaceFormula看起来你自己制作了一个拙劣版本的transform
> set.seed(24)
> dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5)
> df <- as.data.frame(dataset)
> transform(df, V5 = V3 + V4)
V1 V2 V3 V4 V5
1 1 5 3 5 8
2 1 1 2 1 3
3 4 4 4 NA NA
4 3 4 4 3 7
5 3 1 1 NA NA
>设置种子(24)
>数据集df转换(df,V5=V3+V4)
V1 V2 V3 V4 V5
1 1 5 3 5 8
2 1 1 2 1 3
34NA
4 3 4 4 3 7
53111NA
看起来您已经为自己制作了一个拙劣版本的transform
> set.seed(24)
> dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5)
> df <- as.data.frame(dataset)
> transform(df, V5 = V3 + V4)
V1 V2 V3 V4 V5
1 1 5 3 5 8
2 1 1 2 1 3
3 4 4 4 NA NA
4 3 4 4 3 7
5 3 1 1 NA NA
>设置种子(24)
>数据集df转换(df,V5=V3+V4)
V1 V2 V3 V4 V5
1 1 5 3 5 8
2 1 1 2 1 3
34NA
4 3 4 4 3 7
53111NA
我们可以将公式作为quosure
传递,并通过在dplyr
的开发版本(或即将发布的0.6.0
中取消引用(!!
或UQ
)对其进行评估
库(dplyr)
replaceFormula我们可以将公式作为quosure
传递,并通过在dplyr
的开发版本(或即将发布的0.6.0
)中取消引用(!!
或UQ
)对其进行评估
库(dplyr)
仅供参考,他们特别要求没有第三方的解决方案packages@docendodiscimus我同意OP可能不想要第三方软件包,但我认为其他读过这篇文章的人会从中受益。同样,OP似乎想要一个公式传递到一个函数中,这完全独立于你的答案和我的观点。不管怎样,我不介意你answer@akrun-您所说的“不向函数传递参数”是什么意思。我很确定它将输入数据和表达式作为参数传入。因为它不是字符串输入,也不是我定义的函数。。。我不明白你的论点是什么。不要试图对抗。。。这似乎是一个奇怪的说法。@Dason我指的是OP定义函数的方式,我的理解是他想将其作为字符串传递以进行求值。仅供参考,他们特别要求没有第三方的解决方案packages@docendodiscimus我同意OP可能不想要第三方软件包,但我认为其他读过这篇文章的人会从中受益。同样,OP似乎想要一个公式传递到一个函数中,这完全独立于你的答案和我的观点。不管怎样,我不介意你answer@akrun-您所说的“不向函数传递参数”是什么意思。我很确定它将输入数据和表达式作为参数传入。因为它不是字符串输入,也不是我定义的函数。。。我不明白你的论点是什么。不要试图对抗。。。这似乎是一个奇怪的语句。@Dason我指的是OP定义函数的方式,我的理解是他希望将其作为字符串传递以进行求值。请查看帮助页面“重新格式化”。根据您的新情况,我更新了我的帖子。请检查这是否是您想要的查看帮助页面“重新格式化”。根据您的新情况,我更新了我的帖子。请检查这是否是您想要的快速第二个问题:是否也有类似的方法将条件作为参数传递?例如,我有一个函数:replaceFactor@Blind0ne我真的不明白你想用这个代码做什么其他与你的答案类似的选项是内(df,V5@Dason用例,具有相同的数据帧:replaceFactor(df,'V5',V1==1,'GOOD'))
如果a条件在另一个条件中得到满足,则只需替换这些值即可column@akrun很好。我更喜欢transform
版本,但我很久没有考虑过中的,所以这是一个很好的提醒。快速第二个问题:是否也有类似的方法将条件作为参数传递?例如,我有这个函数:replaceFactor@Blind0ne我真的不明白你想用这个代码做什么其他与你的答案类似的选项是内(df,V5@Dason用例,具有相同的数据帧:replaceFactor(df,'V5',V1==1','GOOD')
如果a条件在另一个条件中得到满足,则只需替换这些值即可column@akrun很好。我更喜欢transform
版本,但我很久没有在中考虑,所以这是一个很好的提醒。
> set.seed(24)
> dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5)
> df <- as.data.frame(dataset)
> transform(df, V5 = V3 + V4)
V1 V2 V3 V4 V5
1 1 5 3 5 8
2 1 1 2 1 3
3 4 4 4 NA NA
4 3 4 4 3 7
5 3 1 1 NA NA
library(dplyr)
replaceFormula <- function(dat, Col, form){
Col <- quo_name(enquo(Col))
dat %>%
mutate(UQ(Col) := UQ(form))
}
replaceFormula(df, V5, quo(V3 + V4))
# V1 V2 V3 V4 V5
#1 1 5 3 5 8
#2 1 1 2 1 3
#3 4 4 4 NA NA
#4 3 4 4 3 7
#5 3 1 1 NA NA
replaceFormulaNew <- function(dat, Col, form, what){
Col <- enquo(Col)
ColN <- quo_name(Col)
what <- quo_name(enquo(what))
dat %>%
mutate(UQ(ColN) := ifelse(UQ(form), what, UQ(Col)))
}
replaceFormulaNew(df, V5, quo(V1==1), GOOD)
# V1 V2 V3 V4 V5
#1 1 5 3 5 GOOD
#2 1 1 2 1 GOOD
#3 4 4 4 NA 4
#4 3 4 4 3 <NA>
#5 3 1 1 NA 1
replaceFormulaNew(df, V5, quo(V3 < V4), GOOD)
# V1 V2 V3 V4 V5
#1 1 5 3 5 GOOD
#2 1 1 2 1 3
#3 4 4 4 NA <NA>
#4 3 4 4 3 <NA>
#5 3 1 1 NA <NA>