2011-10-21 43 views
8

我參加了一個大的編程競賽的明天在哪裏我用R.縮寫和在編程大賽

時間的主要因素(僅2個小時7個編碼問題)準備功能。 這些問題是非常數學相關的。

  1. 當我定義一個函數時,我想寫「f」而不是「function」。 這是可以做到,我有代碼這樣做,但我失去了它,並不能找到它。

  2. 我在哪裏可以找到度數輸入的sin()函數,而不是弧度?

  3. (可選)是否有任何算法特定的任務視圖或庫。

  4. 編程比賽的任何提示?

我準備比賽下列備忘單: http://pastebin.com/h5xDLhvg

========編輯:==========

所以最後有時間寫下我的經驗教訓。

編程比賽很有趣,但不幸的是我沒有得分。我排在前50%,但我的目標是進入前25%。

主要問題是編程時間很短,總共只有2個小時。但是我必須閱讀問題描述,並且還需要一些時間將結果粘貼到Web表單等中,因此更像是90分鐘的編程。

希望在12月的下一次比賽將延長時間,如3-4小時。組織者說可能會是這樣。

此外,在比賽中沒有互聯網接入,我的移動接收並沒有真正的工作。

對我來說,主要的教訓是你必須使用你每天使用的語言纔能有真正的機會。特別是,如果只有大約90分鐘的時間來編程。由於我在日常工作中使用haskell比R多,所以我認爲R不是最好的選擇。在比賽期間,我混淆了haskell和R函數的定義,並且我做了太多小的拼寫錯誤以足夠快地編程。

什麼是偉大的關於比賽的是,有大約20 000塊錢獎金總額爲約80人蔘加。因此,前25%的參與者每人獲得500至1500美元。此外,我認爲前15%的人可以從其中一家贊助商IT公司獲得工作。

所以這是一個雙贏的局面。這很有趣,再加上你可以得到獎金。此外,IT公司也非常高興,因爲他們可以訪問頂級程序員。

我曾經有機會與IT決策者交談。其中一個來自一家大型銀行。我大膽地建議他們考慮改用Scala開發(從Java開始)。並考慮使用R和Haskell。這很有趣,他們甚至說他們已經看過斯卡拉!

有趣的是,我的一個好朋友在比賽中取得了非常好的成績。他只有19歲,但他排名前20%,獲得500美元獎金。他擊敗了我和我的6所大學,他們都擁有可敬的計算機科學學位。我的朋友計劃更像黑客風格,但他非常快。

人們在使用的前10名: 1)的Java 2)C#和 3)C++ (沒有其他節目的前10種語言!)。 我認爲唯一能得到相當好的編程語言是Ruby。

對於下一次比賽,選擇的編程語言可能是haskell。出於一個原因,找到兩名Haskell隊友比R編程更容易。最多3人可以組成一個團隊。

我的理想場景是一個非常輕的框架,我可以一次使用多種編程語言進行比賽。這樣,主代碼就可以用haskell編寫(所有的隊友都可以編程)。還有一些特定的功能可以用R或Mathematica編程,甚至可以用其他編程語言(如python/sage)編程。

這聽起來有點矯枉過正。但我認爲這將是非常有用的。就像一個以矩陣作爲參數並返回一個矩陣的函數一樣。然後這個框架工作從R代碼自動生成一個RESTful服務,所以我可以從任何編程語言調用R函數。矩陣只是作爲JSON數據(或其他一些序列化)傳遞。好吧,但這是題外話...

所以最後一些經驗教訓,作爲一個符號列表:

  • 不帶食物。你沒有時間吃,而且有豐富的自助餐後
  • 時間是限制因素!
  • ,如果你的生活沒有計劃R,不要用[R
  • 找找比賽哪裏有更多的時間(3-4 hourss最低!)
  • 所有的一切,比賽的概念太棒了!既爲參與者,也爲贊助商。

非常感謝'Iterator'的幫助!

+0

祝您好運。贏得一個R. :) – Iterator

+3

對不起,說這個,但你的問題不符合在[faq](http://stackoverflow.com/faq)中解釋的格式。將來,將您的問題分解爲多個可逐個回答的問題。祝你好運。 –

+0

我同意約里斯。更重要的是,您可以通過發佈一些示例問題獲得更合適的答案。就個人而言,如果問題是非常數學的,我不會使用R - 如果計算機代數系統更適合,然後使用它。 (例如Mathematica或其開源替代品。) – Iterator

回答

24

我要回答一個相關但不同的問題。沒有冒犯,但你的原始建議似乎不是一個編程競賽的明智之舉。在這種情況下花費的大部分時間都是在設計一個答案並進行調試(或者更好的是避免調試)。

相反,我會回答這個問題:「什麼是R中是快速原型有用的關鍵資源,重點是能夠迅速找到資源,能夠快速調試,並能調查數據很快?如果我需要使用數值優化方法和代數系統,我應該怎麼查「

這裏是我的答案:

  1. 安裝RStudio或可能的革命分析R,這取決於界面似乎更合適兩者都很好,前者具有非常流暢的圖形用戶界面,後者具有更強大的界面,更多的代碼管理能力,兩者在「社區」R有關於能夠查找信息和瀏覽快速幫助圖書館
  2. 熟悉example(),確定從哪裏獲得短片和教程(從包裝年齡'頁在CRAN),並且簡要地看demo()
  3. 使用sos庫和主要findFn
  4. 查看CRAN上的任務視圖 - 確保您瞭解高性能計算(如果這將與之相關)的工具以及優化工具 - 通常需要使用某種解算器,並且有a task view for that
  5. 如果您的代碼在原型或競爭期間運行緩慢,則需要運行Rprof()。先拿這個來旋轉。如果您的代碼涉及很多次迭代,則您也可以使用compiler軟件包獲益。總之:你不想在電腦上等待。如果您可以將作業打包到不同的內核,您也可以查看foreachdoSMPdoMC。爲了彙總結果,熟悉plyrldply等方法以及標準*apply函數,如lapplyapply;另一個很好的知道是rapply。 (如果你有很多東西的過程,它需要一些時間,看看mclapply.parallel參數爲plyr功能。)
  6. 在堆棧溢出:瀏覽JD Long's questions - 太多的你會發現,你不知道會是什麼在你想要問之前已經被他問過了。那裏已經有了答案。
  7. 爲自己創建一些小代碼模板。掌握功能,以便您不必急於學習。學習如何使用debug()browser()進行調試並逐步完成。
  8. 如果要算的東西,學習如何使用hash包(類似於Perl和Python哈希表),並學會使用digest用於太長用於hash鍵(見this question爲參考)
  9. 如果你將需要繪製的東西,讓準備了一些基本的例子地塊,即使用plotggplot2,與histboxplot一起,和其他一些人。如果你不知道ggplot2,那麼推遲,但你應該熟悉它。如果您碰巧使用了大量數據,那麼請確保您知道hexbin。如果您需要與數據交互,請了解iplots以及那裏有趣的工具,如iplotihist和平行座標圖(ipcp)。
  10. 確保您知道如何使用列表,數據框和矩陣(包括下標),根據(行,列)索引查找條目。 (同樣,請務必調查plyr以轉換和操作其中一些對象。)
  11. 熟悉data.table() - 對於數據框架和矩陣可能做的很多事情來說,這是非常有效的。
  12. 如果你需要做符號數學,請確保你知道那個包或者另外一個獨立的符號數學工具。 Ryacas是一個似乎很有用的軟件包。
  13. 獲取果殼中的R的PDF,以便您可以快速搜索它以獲取有用的方法。否則,拿到書本身。各種其他書籍,如Venables & Ripley,R Cookbook和其他書籍可能會有所幫助,具體取決於您的經驗。
  14. 如果您已經掌握了一個優秀的編輯器(例如emacs)或IDE(例如Eclipse),請堅持使用它,並尋找與R的綁定。否則,您可以立即開始使用的一個簡單的記事本++。能夠做塊選擇是編輯器中非常有用的屬性。能夠搜索代碼示例的整個目錄層次結構是另一個有用的功能。
  15. 如果您需要做任何涉及數據庫數據的事情,您可能想知道RSQLitesqldf,儘管這些可能與數學競賽無關。
  16. 打開一堆R實例,以便嘗試一下。 :) [這實際上是嚴重的:通過運行多個實例,可以稍微避免與連續嘗試,等待結果,然後調試結果相關的延遲。]
5

對於(2),你可以只是做:

sindeg <- function(x) sin(x*pi/180) 
+0

感謝您的解決方案! – mrsteve

8

對於(1),你可以這樣做

f <- function(..., body) 
{ 
    dots <- substitute(...) 
    body <- substitute(body) 
    f <- function() 
    formals(f) <- dots 
    body(f) <- body 
    environment(f) <- parent.env(environment()) 
    f 
} 

,它可以讓你寫,例如,g <- f(x, y, body=x+y)但我不知道多遠讓你。

+0

很酷,但肯定不值得,2擊鍵。 – Karl