2016-07-17 1 views
1

Я видел аналогичный вопрос here и example 5 here, но я не могу заставить свой пример работать. Я не очень опытен в R, так что, возможно, это что-то глупое. Я просто хочу иметь функцию, что аргумент является именем столбца используется sqldfR: Передача аргумента функции sqldf

Моя догадка:

function1 <- function(x) { 
    ranking_test <<- sqldf ('select $x from lat_lon_combo t1') 
} 

function1(t1.lat_lon) 

приводит

«Ошибка в MGET (слова, Envir, "любой", Н., наследует = TRUE): объект 't1.lat_lon' не найден»

Хотя t1.lat_lon должно существовать. Любые идеи?

+1

Замените 'sqldf' на' fn $ sqldf', а затем 'function1 (" abc ")' будет работать, если 'abc' является допустимым именем столбца, которое не содержит специальных символов. См. Пример 5 на домашней странице sqldf : https://github.com/ggrothendieck/sqldf –

+0

Очень приятно! Спасибо, поэтому t1. $ X get - это работа в этом случае. Спасибо за пакет, это оказалось очень полезным для меня. – khhc

ответ

0

Общая ошибка. Возможно, существует имя столбца t1.lat_lon, но при вашем вызове function1 вы ссылаетесь на переменную по имени t1.lat_lon, которой не существует.

У вас есть несколько вариантов, и для простоты я рекомендую первые (строки):

  1. передать его в виде строки, и использовать paste или sprintf для формирования строки запроса. Такие, как:

    library(sqldf) 
    func1 <- function(x) { 
        sqldf(sprintf("select %s from mtcars where cyl > 7", x)) 
    } 
    func1("disp") 
    
  2. Если вы действительно должны ссылаться на него без кавычек, вы можете сделать это обман, но в этом случае нет необходимости сложность (для двух символов кавычек):

    func2 <- function(x) { 
        sqldf(sprintf("select %s from mtcars where cyl > 7", 
            deparse(substitute(x)))) 
    } 
    func2(disp) 
    

    Этот тип разыменования используется (и полезен) при выполнении чего-то вроде plot(disp ~ mpg, data = mtcars) (хотя это делает вещи несколько иначе по формуле). В таких ситуациях он добавляет полезности за счет некоторой сложности кода и косвенности. Если вам это не нужно (и, основываясь на вашем примере, это не похоже на то, что вы делаете), то я бы избегал этого ради простоты.

КСТАТИ: в обоих случаях я вернуть значение, возвращенное из sqldf, я выбрал (и я настоятельно призываю) против побочных эффектов, как вы делали в вашей функции. Side effects может быть желательным, но, если этого избежать, предполагается обеспечить более чистые и более предсказуемые функции.

+0

Спасибо, что он хорошо работает! Конечно, все это одна большая строка! О стороне влияет, вы говорите, что неразумно использовать функцию для записи в переменную «ranking_test»? – khhc

+0

Что касается нисходящего потока, можете ли вы помочь мне понять, что можно улучшить? Это немного хакерское, конечно, но комментарий поможет мне улучшить и ответить на будущие ссылки. – r2evans

+0

Обычно используется 'fn $ sqldf' для выполнения строковой интерполяции в строке SQL в соответствии с комментарием к вопросу. –