, и вам все еще нужно расстаться с этим. То есть также работает следующее:

юсь с программированием, используяdplyr в R для работы со столбцами фрейма данных, которые известны только по именам строк. Я знаю, что недавно было обновлениеdplyr для поддержки цитат и тому подобного, и я рассмотрел, как мне кажется, соответствующие компоненты новой статьи «Программирование с помощью dplyr» здесь:http://dplyr.tidyverse.org/articles/programming.html, Однако я все еще не могу делать то, что хочу.

Моя ситуация такова, что я знаю имя столбца фрейма данных только по имени строки. Таким образом, я не могу использовать нестандартную оценку при обращении кdplyr внутри функции или даже сценария, в котором имя столбца может меняться между запусками, потому что я не могу жестко закодировать имя столбца без кавычек (то есть «голое») в целом Мне интересно, как обойти это, и я предполагаю, что я что-то упускаю из виду с новым синтаксисом цитирования / отмены цитирования.

Например, предположим, что у меня есть пользовательские вводы, которые определяют процентили отсечения для распределения данных. Пользователь может запустить код, используя любой процентиль, который он / она захочет, и процентиль, который он / она выберет, изменит вывод. В рамках анализа создается столбец в промежуточном фрейме данных с именем используемого процентиля; таким образом, имя этого столбца изменяется в зависимости от введенного пользователем процентиля обрезки.

Ниже приведен минимальный пример для иллюстрации. Я хочу вызвать функцию с различными значениями для процентиля отсечки. Я хочу фрейм данных с именемMPGCutoffs иметь столбец, который назван в соответствии с выбранным квантилем обрезки (это в настоящее время работает в приведенном ниже коде), и я хочу позже работать с этим именем столбца. Из-за общности названия этого столбца я могу знать его только с точки зрения вводаpctCutoff на момент написания функции, поэтому мне нужен способ работать с ней, когда известно только строку, определеннуюprobColName, который следует предварительно определенному шаблону на основе значенияpctCutoff.

userInput_prob1 <- 0.95
userInput_prob2 <- 0.9

# Function to get cars that have the "best" MPG
# fuel economy, where "best" is defined by the
# percentile cutoff passed to the function.
getBestMPG <- function( pctCutoff ){

  # Define new column name to hold the MPG percentile cutoff.
  probColName <- paste0('P', pctCutoff*100)

  # Compute the MPG percentile cutoff by number of gears.
  MPGCutoffs <- mtcars %>%
    dplyr::group_by( gear ) %>%
    dplyr::summarize( !!probColName := quantile(mpg, pctCutoff) )

  # Filter mtcars with only MPG values above cutoffs.
  output <- mtcars %>%
    dplyr::left_join( MPGCutoffs, by='gear' ) %>%
    dplyr::filter( mpg > !!probColName ) #****This doesn't run; this is where I'm stuck

  # Return filtered data.
  return(output)
}

best_1 <- getBestMPG( userInput_prob1 )
best_2 <- getBestMPG( userInput_prob2 )

dplyr::filter() Это то, что я не могу правильно запустить Я пробовал:

dplyr::filter( mpg > probColName ) - Нет ошибки, но строки не возвращены.

dplyr::filter( mpg > !!probColName ) - Нет ошибки, но строки не возвращены.

Я также видел примеры, где я мог передать что-то вродеquo(P95) к функции, а затем кавычки в вызовеdplyr::filter(); Я получил это на работу, но это не решает мою проблему, так как требует жесткого кодирования имени переменной вне функции. Например, если я делаю это, а процентиль, переданный пользователем, равен 0,90, то вызовdplyr::filter() не удается, потому что созданный столбец называетсяP90 и нетP95.

Любая помощь будет принята с благодарностью. Я надеюсь, что есть простое решение, которое я просто пропускаю.

Ответы на вопрос(2)

указанном в ответе MrFlick (https://github.com/tidyverse/rlang/issues/116). С помощьюas.name() от базы R занимает местоrlang::sym(), и вам все еще нужно расстаться с этим. То есть также работает следующее:

dplyr::filter( mpg > !!as.name(probColName) )

Решение Вопроса

тите использовать его с tidyeval, то вы можете скрыть его с помощьюrlang::sym(), Просто поменяй

dplyr::filter( mpg > !!rlang::sym(probColName) )

и это должно работать. Это взято из рекомендации в этом выпуске github:https://github.com/tidyverse/rlang/issues/116

Это все еще хорошо для использования

dplyr::summarize( !!probColName := quantile(mpg, pctCutoff) )

потому что при динамической установке имени параметра вам просто нужна строка, а не символ без кавычек.

 MrFlick20 сент. 2017 г., 15:41
Если вы проверите?sym На странице справки вы можете увидеть разницу в том, как они обрабатывают кодировку, но в остальном они в основном одинаковы.
 MrFlick20 сент. 2017 г., 00:07
Это действительно имеет отношение к тому, когда вы хотите, чтобы символ был оценен, и когда вы хотите, чтобы он был оценен. !! дает вам больше контроля над этим.
 bmosov0119 сент. 2017 г., 23:53
Это именно то, что я хотел сделать, спасибо @MrFlick. Вопрос: когда я оцениваюstr(rlang::sym(probColName)) это возвращаетсяsymbol 95 (или другой номер в зависимости от значенияpctCutoff, Что это!! оператор делать в случае символа? Это преобразование его в голое имя переменной без кавычек?
 MrFlick19 сент. 2017 г., 23:59
Символ - это как выражение без среды. !! В основном соски и символы и предложения одинаковы. Символ - это имя переменной без кавычек. Это то, что использовалось до того, как tidyeval изменил парадигму.
 bmosov0120 сент. 2017 г., 00:05
Мне интересно, что оператор Unquote!! все еще требуется для символа, если символ представляет собой просто имя переменной без кавычек, чтоdplyr глаголы ожидают с помощью NSE. В любом случае, это решает проблему, с которой я столкнулся некоторое время, и с обновленной обработкой quosure с последней версиейdplyr, позволит гораздо более упорядоченную обработку общих аргументов для функций, которые используютdplyr глаголы. Спасибо за понимание!

Ваш ответ на вопрос