Как мне создать функцию, которая возвращает уравнение из аргумента? - PullRequest
0 голосов
/ 27 мая 2020

Например, у меня есть функция с аргументами «x», «d» и «уравнение». Аргумент «x» - это мой фрейм данных, аргумент «d» - это столбец фрейма данных numeri c, а в аргумент «уравнение» я хотел вставить уравнение «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))

Ответы [ 4 ]

2 голосов
/ 27 мая 2020

Аналогично другим ответам. Однако функции, которые работают с побочным эффектом, исключают такие вещи, как: присвоение новой переменной (один ответ предлагает способ сделать это) или работа в конвейере (например, %>%).

Я предлагаю без побочных эффектов (<<- и 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

(Это не работает при использовании побочного эффекта.)

В качестве альтернативы, у нас уже есть функция в базе 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
2 голосов
/ 27 мая 2020

Я предполагаю, что вы хотите применить 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
2 голосов
/ 27 мая 2020

Вы имели в виду что-то подобное?

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

Создано 27.05.2020 с помощью пакета . (v0.3.0)

0 голосов
/ 27 мая 2020

Здесь вы можете напрямую вернуться в глобальную среду:

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" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...