Проблема в том, что $
является нестандартным, в том смысле, что, когда вы не заключаете в кавычки параметр ввода, он все равно пытается проанализировать его и использовать то, что вы ввели, даже если это было предназначено для ссылки на другая переменная.
Или, проще, как @ 42 выразил это в первом комментарии в связанном вопросе :
Функция "$" не оценивает свои аргументы, тогда как "[[" делает`.
Вот гораздо более простой набор данных в качестве примера.
my_df <- data.frame(a=c(1,2))
v <- "a"
Сравните обычное использование; первые два дают одинаковый результат, если вы не цитируете его, он анализирует его. Так что третий (сейчас) явно не работает должным образом.
my_df$"a"
## [1] 1 2
my_df$a
## [1] 1 2
my_df$v
## NULL
Это именно то, что происходит с вами:
`$`(my_df, "a")
## [1] 1 2
`$`(my_df, v)
## NULL
Вместо этого нам нужно оценить v
перед отправкой на $
с помощью do.call
.
do.call(`$`, list(my_df, v))
## [1] 1 2
Или, более целесообразно, использовать версию [[
, которая сначала оценивает параметры.
`[[`(my_df, v)
## [1] 1 2