2015-11-18 30 views
0

如何獲取函數的變量名稱以在字符串內動態執行?如何獲得r中字符串的動態變量?

下面是我嘗試實現的內容的摘錄:一個根據varName生成列表的函數。但是我不能讓varName在字符串sqldf(...)內動態動作。我認爲這個問題不是特定於包sqldf

createExcelSheetData<-function(varName){ 
    sqldf(" 
     SELECT Name 
     FROM dataTable 
     WHERE Choice=varName 
     ") 
} 
table1<-createExcelSheetData(1) 
table2<-createExcelSheetData(2) 
table3<-createExcelSheetData(3) 

以上給我的是固定文本varName的選項。

更新:要在文本中有變量,而不只是在最後。

createExcelSheetData<-function(varName){ 
    sqldf(" 
     SELECT Name 
     FROM dataTable 
     WHERE Choice=varName 
     ORDER BY Name 
     ") 
} 
table1<-createExcelSheetData(1) 
table2<-createExcelSheetData(2) 
table3<-createExcelSheetData(3) 
+0

使用'paste':'sqldf(粘貼( 「選擇的名字從dataTable的WHERE選擇=」 varName的))'。 – nicola

+0

@nicola謝謝你的答案。有用。如果文本不只是末尾,我需要粘貼兩種用途嗎?還是有更優雅的解決方案?查看我的意思是更新嗎? – Geoff

+0

請參閱'?paste'。您必須構建查詢的字符串。在更新的情況下,嘗試粘貼(「SELECT名稱從dataTable WHERE選擇=」,varName,「ORDER BY名稱」)''。 – nicola

回答

1

fn$是實施例6中的sqldf home page討論。這裏是一個自包含的最小可重複的例子,使用R隨附的iris數據框:(將來請確保所有代碼都是最小和可重現的,特別是包括所有輸入)。

library(sqldf) 

# retrieve records for specified Species and Petal.Length above minPetalLength 
f <- function(Species, minPetalLength) { 
      fn$sqldf("SELECT * 
        FROM iris 
        WHERE Species = '$Species' and [Petal.Length] > $minPetalLength") 
} 

f("virginica", 6) 

,並提供:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   7.6   3.0   6.6   2.1 virginica 
2   7.3   2.9   6.3   1.8 virginica 
3   7.2   3.6   6.1   2.5 virginica 
4   7.7   3.8   6.7   2.2 virginica 
5   7.7   2.6   6.9   2.3 virginica 
6   7.7   2.8   6.7   2.0 virginica 
7   7.4   2.8   6.1   1.9 virginica 
8   7.9   3.8   6.4   2.0 virginica 
9   7.7   3.0   6.1   2.3 virginica 
+0

非常感謝。我從你的回答中看到問題確實是'sqldf'的依賴。如果我想要一個在另一個函數中做類似替換的函數(比如'write.xlsx')怎麼辦? – Geoff

+1

不是。它不依賴於sqldf。 fn甚至不是sqldf的一部分。它是sqldf自動引入的gsubfn的一部分.fn幾乎適用於任何函數。試試更多信息。我只使用了sqldf,因爲你做到了。 –