Это две разные проблемы, но я думаю, что они могут иметь один и тот же базовый код, влияющий на них обоих. Во-первых, с select_
я не могу использовать пробелы в имени:
> mtcars_tbl <- tbl_df(mtcars)
> mtcars_tbl <- rename(mtcars_tbl, `miles per gallon` = mpg)
> select_(mtcars_tbl, "miles per gallon")
Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per
То же самое, если я действительно использую переменную, как «задумано».
> tmp <- "miles per gallon"
> select_(mtcars_tbl, tmp)
Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per
Итак, передаю ли я фактическую переменную со строкой в ней, как я полагаю, было первоначальным намерением, или если мне просто нужен более чистый способ работы с пробелами, select_
все равно не работает. filter_
(и, предположительно, другие) также не работает:
> filter_(mtcars_tbl, "miles per gallon")
Error in parse(text = x) : <text>:1:7: unexpected symbol
1: miles per
Хорошо, теперь перейдем к проблеме 2:
filter_
, похоже, вообще не работает, даже если этот пробел не является проблемой. Например:
> filter_(mtcars_tbl, "cyl" > 4) %>% arrange(cyl) %>% head(2)
miles per gallon cyl disp hp drat wt qsec vs am gear carb
1 22.8 4 108.0 93 3.85 2.32 18.61 1 1 4 1
2 24.4 4 146.7 62 3.69 3.19 20.00 1 0 4 2
против
> filter(mtcars_tbl, cyl > 4) %>% arrange(cyl) %>% head(2)
miles per gallon cyl disp hp drat wt qsec vs am gear carb
1 21 6 160 110 3.9 2.620 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
Я поигрался с ним еще, глядя на dim()
и т. Д. Совершенно ясно, что с filter_
ничего не происходит. : frowning:
Что касается проблемы 2, это ошибка пользователя. Вы можете использовать "cyl >4"
или ~cyl > 4
, но здесь происходит следующее:
> "cyl" > 4
[1] TRUE
так что вы получите все данные обратно.
Для решения первой проблемы вам нужно:
tmp <- "miles per gallon"
select_(mtcars_tbl, as.name(tmp))
Ромен,
Спасибо, что уловили мою ошибку! Думаю, когда я увидел, что одна вещь не работает, я начал подозревать пакет больше, чем свой код.
Хэдли,
Спасибо за ваше решение. Это сработает в краткосрочной перспективе, но является ли это долгосрочным решением? В чем вред от автоматической обертывания всего "as.name" в "* _" разновидностях пакета? Это приводит к сбою чего-то еще где-то еще?
Как я уже упоминал, есть две причины использовать ароматы "* _":
Это фундаментальный выбор - должен ли "my weird variable"
работать, или должен "starts_with('abc')
работать. Я остановился на последнем, а менять уже поздно. as.name()
говорит, что у вас есть имя переменной, что мне кажется довольно разумным.
Привет Хэдли,
Хорошо понял! Так что, к сожалению, неизбежны конфликты в том, как интерпретировать имена. Я понимаю это, так как это было отравой R на протяжении многих лет.
Думаю, я просто надеялся, что со всеми чудесными вещами, с которыми удалось справиться dplyr, tidyr, ggplot2 и т. Д., Несмотря на то, что я полагался на язык, который сделал некоторые плохие выборы под капотом, что, возможно, вы нашли какой-нибудь крутой волшебный способ чтобы решить и эту проблему.
Спасибо за ваш ответ и за все ваши замечательные пакеты!
Самый полезный комментарий
Для решения первой проблемы вам нужно: