Можно ли объединить параметры в функцию подмножества, которая генерируется программно в R? - PullRequest
0 голосов
/ 28 ноября 2018

Перед моим вопросом вот небольшой фон.

Я создаю универсальную библиотеку для формирования и составления диаграмм данных для построения данных съемки определенного формата.

Как часть моих сценариев, я использую функцию подмножества в моем фрейме данных.Я работаю так, что у меня есть файл параметров, в котором я могу передать эти критерии поднабора в свои функции (поэтому мне не нужно напрямую редактировать основную библиотеку).Я делаю это следующим образом:

subset_criteria <- expression(variable1 != "" & variable2 == TRUE) 

(где variable1 и variable2 являются столбцами в моем фрейме данных, например).

Затем в моей функции я вызываю это следующим образом:

my.subset <- subset(my.data, eval(subset_criteria))

Эта часть работает именно так, как я хочу, чтобы она работала.Но теперь я хочу дополнить этот критерий поднабора внутри функции, основываясь на некоторых других вычислениях, которые могут быть выполнены только внутри функции.Поэтому я пытаюсь найти способ объединить эти выражения подмножеств.

Представьте себе, что внутри моей функции я автоматически создаю новый столбец во фрейме данных, а затем хочу добавить условие в мое подмножество, которое говорит, чтоэтот дополнительный столбец должен быть ИСТИНА.

По сути, я делаю следующее:

my.data$newcolumn <- with(my.data, ifelse(...some condition..., TRUE, FALSE))

Тогда я хочу, чтобы мое подмножество закончилось так:

my.subset <- subset(my.data, eval(subset_criteria & newcolumn == TRUE))

Но этоне похоже, что делать то, что я перечислю выше, действительно.Я получил неправильное решение.Поэтому я ищу способ объединения этих выражений с использованием expression и eval, чтобы по существу получить комбинацию всех условий.

Спасибо за любые указатели.Было бы здорово, если бы я мог сделать это без необходимости переписывать, как я делаю все мои выражения, но я понимаю, что это может быть то, что нужно ...

Боб

1 Ответ

0 голосов
/ 28 ноября 2018

Вам, вероятно, следует избегать двух вещей: использовать subset в неинтерактивной настройке (см. Предупреждение на страницах справки) и eval(parse()).Вот и мы.

Вы можете изменить выражение в строку и добавить его как хотите.Хитрость заключается в том, чтобы преобразовать строку обратно в выражение.Вот где приходит вышеупомянутое parse.

sub1 <- expression(Species == "setosa")

subset(iris, eval(sub1))

sub2 <- paste(sub1, '&', 'Petal.Width > 0.2')

subset(iris, eval(parse(text = sub2)))  # your case

> subset(iris, eval(parse(text = sub2)))
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
16          5.7         4.4          1.5         0.4  setosa
17          5.4         3.9          1.3         0.4  setosa
18          5.1         3.5          1.4         0.3  setosa
19          5.7         3.8          1.7         0.3  setosa
20          5.1         3.8          1.5         0.3  setosa
22          5.1         3.7          1.5         0.4  setosa
24          5.1         3.3          1.7         0.5  setosa
27          5.0         3.4          1.6         0.4  setosa
32          5.4         3.4          1.5         0.4  setosa
41          5.0         3.5          1.3         0.3  setosa
42          4.5         2.3          1.3         0.3  setosa
44          5.0         3.5          1.6         0.6  setosa
45          5.1         3.8          1.9         0.4  setosa
46          4.8         3.0          1.4         0.3  setosa
...