Хранение функций в списке R - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать блестящее приложение, чтобы помочь с анализом решений. В части приложения пользователь должен ввести свою служебную функцию в виде текста, который R / блестящий конвертирует в выражение. Предположим, что пользователь имеет три части своих функций полезности, которые будут объединены в большую функцию полезности. У меня проблема с определением элементов списка в for l oop:

utility.fns <- list()

ufs <- list() ## user input

## each ufs is specified by the user

ufs[[1]] <- "x+1"
ufs[[2]] <- "sin(x)"
ufs[[3]] <- "cos(x)^2"


for(i in 1:3){

  ## turn the text into functions

  utility.fns[[i]] <- function(x){
   eval( parse(text = ufs[[i]]) )
  }
}



utility.fns[[1]](1) ## returns cos(1)^2 ?

. Странно то, что список utility.fns всегда возвращает utility.fns[[3]], независимо от индекса. Однако ручное переопределение

> utility.fns[[1]] <- function(x){
+   eval( parse(text = ufs[[1]]) )
+ }
> utility.fns[[1]](1)
[1] 2

устраняет проблему. Очевидно, я не могу вручную переопределить каждый раз!

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Используйте lapply вместо for

utility.fns <- lapply(1:3, function(i){function(x){eval(parse(text = ufs[[i]]) )}})
0 голосов
/ 08 апреля 2020

Причина, по которой он всегда возвращает utility.fns[[3]], заключается в том, что если вы отметите utility.fns

utility.fns[[1]]

#function(x){
#    eval( parse(text = ufs[[i]]) )
#}
#<bytecode: 0x1223d31c8>

Значение i для l oop закончится на 3, поэтому он всегда вызывает ufs[[3]].

Вы можете сохранить функции в ufs, а самому присваивать значение x, а затем использовать eval, parse

x <- 1
eval(parse(text = ufs[[1]]))
#[1] 2
eval(parse(text = ufs[[2]]))
#[1] 0.841
eval(parse(text = ufs[[3]]))
#[1] 0.292
.
...