简而言之:
您可以在!!!
内使用case_when
拼接和mutate
的列表输入,以及如何使用?
正如dplyr> 0.7.0中对previous question的回答中所述,您可以在case_when()
mutate()
内使用裸变量名称
接下来,在case_when
!!!
中,它显示了如何使用模式列表和x <- 1:50
patterns <- list(
TRUE ~ as.character(x),
x %% 5 == 0 ~ "fizz",
x %% 7 == 0 ~ "buzz",
x %% 35 == 0 ~ "fizz buzz"
)
case_when(!!! patterns)
,如下所示:(模式是错误的方式,一般情况下首先,但实际文档中就是这种情况,对我的问题无关紧要)
testframe <- tibble(y = 1:50) #Switching to y so the x from earlier can't interfere
testframe2 <- testframe %>%
mutate(
fizzbuzz = case_when(
y %% 35 == 0 ~ "fizz buzz",
y %% 5 == 0 ~ "fizz",
y %% 7 == 0 ~ "buzz",
TRUE ~ as.character(y)
)
)
patterns <- list(
y %% 35 == 0 ~ "fizz buzz",
y %% 5 == 0 ~ "fizz",
y %% 7 == 0 ~ "buzz",
TRUE ~ as.character(y)
)
testframe3 <- testframe %>%
mutate(
fizzbuzz = case_when(
!!!(patterns)
)
)
然而,结合这些方法似乎不起作用:
Error in mutate_impl(.data, dots) :
Evaluation error: object 'y' not found.
testframe2可以正常工作,而testframe3会出现以下错误:
quo()
我假设这里有一些NSE魔法,但我没有设法quo()
我的出路。我确实查看了testframe2和3的testframe2quo <- quo(testframe %>%
mutate(
fizzbuzz = case_when(
y %% 35 == 0 ~ "fizz buzz",
y %% 5 == 0 ~ "fizz",
y %% 7 == 0 ~ "buzz",
TRUE ~ as.character(y)
)
)
)
testframe3quo <- quo(testframe %>%
mutate(
fizzbuzz = case_when(
!!!(patterns)
)
)
)
testframe2quo
<quosure: global>
~testframe %>% mutate(fizzbuzz = case_when(y%%35 == 0 ~ "fizz buzz",
y%%5 == 0 ~ "fizz", y%%7 == 0 ~ "buzz", TRUE ~ as.character(y)))
testframe3quo
<quosure: global>
~testframe %>% mutate(fizzbuzz = case_when(y%%35 == 0 ~ "fizz buzz",
y%%5 == 0 ~ "fizz", y%%7 == 0 ~ "buzz", TRUE ~ as.character(y)))
(help file中建议的调试方法)。我注意到他们是一样的:
!!!
所有这些都让我回到了我的问题:
您可以在case_when
内使用mutate
拼接和import corner
fig = corner.corner(samples, labels=["$m$", "$b$", "$\ln\,f$"])
fig.show()
的列表输入,以及如何使用?
答案 0 :(得分:1)
您应该将案例包裹在exprs
而不是list
中并使用前缀.data
patterns <- rlang::exprs(
.data$y %% 35 == 0 ~ "fizz buzz",
.data$y %% 5 == 0 ~ "fizz",
.data$y %% 7 == 0 ~ "buzz",
TRUE ~ as.character(.data$y)
)
mutate(testframe, fizzbuzz = case_when(!!! patterns))