dplyr
и друзья 1 умны, но не могут различить две ссылки на gear
(и carb
). Например, в gear == as.numeric(gear)
вы намереваетесь первым ссылаться на gear
в кадре, а вторым ссылаться на аргумент функции, но в этих функциях первое совпадение gear
(с точностью до кадра, внутри функциональная среда (в окружающих средах) выигрывает и используется для всех ссылок. В этом случае они оба соответствуют столбцу фрейма и поэтому всегда TRUE
(в этом примере).
Попробуйте:
function(carb., gear.) {
mtcars %>% filter(gear == as.numeric(gear.),
carb == as.numeric(carb.)) %>%
jsonlite::toJSON()
}
К сожалению, это приводит к тому, что аргументы API менее эстетичны. Поэтому, если вы хотите сохранить то, как они выглядят (или есть внешние мотиваторы, чтобы оставить их как есть), сделайте быстрое переназначение.
function(carb, gear) {
c. <- carb
g. <- gear
mtcars %>%
filter(gear == as.numeric(g.),
carb == as.numeric(c.)) %>%
jsonlite::toJSON()
}
Примечание: иногда полезно внедрить разрешающую фильтрацию, где пропущенный (или намеренно нулевой) аргумент означает отсутствие фильтрации.
function(carb = NA, gear = NA) {
c. <- carb
g. <- gear
mtcars %>%
filter(is.na(g.) | gear == as.numeric(g.),
is.na(c.) | carb == as.numeric(c.)) %>%
jsonlite::toJSON()
}
Еще одно замечание: есть ли причина, по которой вы здесь делаете двойной JSON? Например, я вижу:
$ curl -s localhost:8000/test2?gear=4
"[{\"mpg\":21,\"cyl\":6,\"disp\":160,\"hp\":110,\"drat\":3.9,\"wt\":2.62,\"qsec\":16.46,\"vs\":0,\"am\":1,\"gear\":4,\"carb\":4},...]"
, который возвращает длинную строку (обратите внимание на кавычки). Многие парсеры увидят это как строку и сохранят ее. (Например, конвейер curl ... | jq .
не открывает JSON должным образом, он просто возвращает буквальную строку.)
Вместо этого, если вы удалите toJSON
, вы увидите:
$ curl -s localhost:8000/test2?gear=4
[{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0,"am":1,"gear":4,"carb":4},...]
, который является "правильным" возвращением json и может быть правильно проанализирован. Добавление | jq .
после того, как вызов curl правильно анализирует вывод:
$ curl -s localhost:8000/test2?gear=4 | jq .
[
{
"mpg": 21,
"cyl": 6,
"disp": 160,
"hp": 110,
"drat": 3.9,
"wt": 2.62,
"qsec": 16.46,
"vs": 0,
"am": 1,
"gear": 4,
"carb": 4
},
...
]
Примечания:
Я должен отметить, что это не уникально для dplyr
, и там не должно быть никакой вины. Такое же поведение можно наблюдать с base::with
и base::within
. Сравните два:
func <- function(carb, gear) { browser(); 1; }
func(1, 3)
# Called from: func(1, 3)
debug at #1: [1] 1
c. <- carb
g. <- gear
with(mtcars, { gear == as.numeric(gear) & carb == as.numeric(carb); })
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [31] TRUE TRUE
with(mtcars, { gear == as.numeric(g.) & carb == as.numeric(c.); })
# [1] FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
# [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
# [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE