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>