R — Получить список выходных значений из формулы

#r #formula #equation

#r #формула #уравнение

Вопрос:

У меня есть формула, которая выглядит примерно так: y = 2 3x x ^ 2, и у меня есть список входных значений, которые я хотел бы подключить к x, а затем отобразить его позже.

Итак, что я делаю, это

 x<-seq(-2,2, length.out=20)
formula <- y~2 3*x x^2
  

Но я не уверен, как подключить список значений x к формуле и получить выходное значение из кодов.
Будем признательны за любую помощь.

Ответ №1:

Вы могли бы определить функцию для вычисления формулы, как показано ниже:

 getScore <- function(x) {
  2 3*x x^2
}
x <- seq(-2,2, length.out=20)
getScore(x)
 [1]  0.00000000 -0.16620499 -0.24376731 -0.23268698 -0.13296399  0.05540166
 [7]  0.33240997  0.69806094  1.15235457  1.69529086  2.32686981  3.04709141
[13]  3.85595568  4.75346260  5.73961219  6.81440443  7.97783934  9.22991690
[19] 10.57063712 12.00000000
  

Ответ №2:

Вы можете преобразовать свою формулу в функцию и использовать sapply :

 x = seq(-2,2, length.out=20)

my.function = function(x){
  return(2 3*x x^2)
}

y = sapply(x, my.function)
> y
 [1]  0.00000000 -0.16620499 -0.24376731 -0.23268698 -0.13296399  0.05540166  0.33240997
 [8]  0.69806094  1.15235457  1.69529086  2.32686981  3.04709141  3.85595568  4.75346260
[15]  5.73961219  6.81440443  7.97783934  9.22991690 10.57063712 12.00000000
  

Если вы хотите list , то используйте lapply вместо sapply .

Комментарии:

1. Здесь нет ничего плохого, но в этом также нет необходимости, sapply потому что все вычисления в my.function векторизованы. Вызов my.function(x) вернет тот же результат, что и вызов sapply(x, my.function) . Смотрите, например, ответ @Sonny. Быстрый тест скорости показывает, что прямой вызов функции в 22 раза быстрее, чем использование sapply (хотя это не имеет значения, имеет ли x какой-либо разумный размер, поскольку разница будет составлять наносекунды)

Ответ №3:

fn$ в gsubfn может использоваться для преобразования формулы в функцию. Если перед такой функцией, как identity , ставится fn$ , то формула в аргументах будет преобразована в функцию, а затем будет запущена функция, которая fn$ предшествует. LHS формулы должна быть входной переменной функции или пустой. В последнем случае в качестве аргументов будут использоваться свободные переменные в RHS. RHS — это тело.

 library(gsubfn)

fo[[2]] <- NULL   # remove LHS
fun <- fn$identity(fo)   # create function from formula

fun
## function (x) 
## 2   3 * x   x^2

fun(x)
##  [1]  0.00000000 -0.16620499 -0.24376731 -0.23268698 -0.13296399  0.05540166
##  [7]  0.33240997  0.69806094  1.15235457  1.69529086  2.32686981  3.04709141
## [13]  3.85595568  4.75346260  5.73961219  6.81440443  7.97783934  9.22991690
## [19] 10.57063712 12.00000000