如何制作一个从参数返回方程的函数?

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" )

以上是关于如何制作一个从参数返回方程的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Mathematica制作隐函数的图像

如何制作一个将 Activity 和 Fragment 作为参数上下文的函数

Oracle PL/SQL 函数 - 调用者声明参数值 => 函数返回方程解

如何根据 service.ts 中的报表 categoryID 参数制作函数返回报表?

如何从 FragmentPagerAdapter 返回多个片段

定义一个函数,接收三个参数返回一元二次方程