dplyr
和朋友1很聪明,但他们无法区分gear
( 和carb
) 的两个引用。例如,在 中gear == as.numeric(gear)
,您打算第一个引用gear
框架内,第二个引用函数参数,但在这些函数中,第一个匹配gear
(to 在框架内、在函数环境内、在封闭环境内)获胜并用于所有参考。在这种情况下,它们都匹配框架的列,因此总是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