如何制作一个从参数返回方程的函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作一个从参数返回方程的函数?相关的知识,希望对你有一定的参考价值。
例如,我有一个参数为 "x"、"d "和 "equation "的函数。x "参数是我的数据框架,"d "参数是数字数据框架列,在 "方程 "参数中,我想插入方程 "d * 5 ^ 0.02"。
作为输出,我需要在数据框中新建一列 "V",其结果为参数方程。
我的想法出了问题。
myfunction <- function(x, d, equation, ...){
x$V <- equation
}
myfunction(x=x, d = x$d, equation = c("d"*5^0.02))
我假设你想 equation
适用于 x$d
,并将结果写到 x$V
.
提供这样的 "等式 "是很不寻常的,而且容易出错。可以考虑创建一个函数。f <- function(x) x * 5^0.02
,然后再进行以下操作。
# dummy data
x <- data.frame(d = 1:10)
# your equation
f <- function(x) x * 5^0.02
g <- function(x, d, f) {
# call function f with column d as its argument
x$V <- f(x[[d]]))
return(x)
}
g(x, "d", f)
d V
1 1 1.032712
2 2 2.065425
3 3 3.098137
4 4 4.130850
5 5 5.163562
与其他答案类似。但是,在侧效应中操作的函数排除了诸如:赋值给一个新的变量(一个答案提出了一种方法),或者在管道内操作(如。%>%
).
我建议不要使用侧效应(<<-
和 assign
).
myfunction <- function(x, d, equation, ...) {
x$V <- eval(substitute(equation), envir = x)
x
}
x <- data.frame(d = 1:5)
myfunction(x, x$d, d*5^0.02)
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
原来的 x
是不变的。使用 功能性 恶习 副作用 范式是,它在(比如)管道中会更好地流动。
library(dplyr)
x %>%
myfunction(d, d*5^0.02)
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
而使用副作用则可能不会影响到它。x
的。
x %>%
filter(between(d, 2, 4)) %>%
myfunction(d, d*5^0.02)
# d V
# 1 2 2.065425
# 2 3 3.098137
# 3 4 4.13085
(当使用side-effect时,这就不适用了。)
另外,我们在基础R中已经有一个函数来实现这个功能。
within(x, { V = d*5^0.02 })
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
transform(x, V = d*5^0.02 )
# d V
# 1 1 1.032712
# 2 2 2.065425
# 3 3 3.098137
# 4 4 4.130850
# 5 5 5.163562
你是不是也有这样的想法?
myfunction <- function(x, d, equation, ...) x$v <<- eval(substitute(equation))
x <- data.frame(d = 1:5)
myfunction(x=x, d = x$d, equation = d*5^0.02)
x
#> d v
#> 1 1 1.032712
#> 2 2 2.065425
#> 3 3 3.098137
#> 4 4 4.130850
#> 5 5 5.163562
思考了一下,我想知道你是否在试图重新发明 within
?
within(x, v <- d*5^0.02)
#> d v
#> 1 1 1.032712
#> 2 2 2.065425
#> 3 3 3.098137
#> 4 4 4.130850
#> 5 5 5.163562
创建于2020-05-27,由 重读包 (v0.3.0)
在这里你可以直接回到全局环境。
x <- data.frame(c(1:2,5:6),c(7:10))
x
colnames(x) <- c("V1","d")
myfunction <- function(x, d, equation,named.df="NA" ,...){
x$V <- equation
assign(named.df,x, envir=.GlobalEnv)
}
myfunction(x=x, d = x$d, equation = c(x$d*5^0.02),"function result" )
以上是关于如何制作一个从参数返回方程的函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作一个将 Activity 和 Fragment 作为参数上下文的函数
Oracle PL/SQL 函数 - 调用者声明参数值 => 函数返回方程解
如何根据 service.ts 中的报表 categoryID 参数制作函数返回报表?