因為最近有需要將mp4和srt字幕檔合併,讓我在看影片時,可以顯示字幕,上網找了一下,發現Free Video Converter這套軟體支援很多格式,又是免費的,決定試用看看,使用之後,發現還滿容易上手。
首先,前往它的網站下載,這裡使用的版本是「4.1.3」。
下載完成後,直接點按安裝檔,下一步接下一步,就可完成安裝。
安裝完成後,點按它的圖示開啟,它的介面長這樣:
這裡我要合併的影片檔格式是mp4,然後我要轉給avi檔,先點按右上角的+ 視訊新增要轉檔的檔案:
新增完成後,會顯示所選取的檔案:
再來點按下方的字幕關閉,這時若在存放影片檔的資料夾中含有檔,會預設帶入為選項,我直接按加入字幕...:
選好字幕後,就點按下方的轉為AVI:
按下後,會跳出一個可以再做一些畫質等的參數,並可以選擇要存放轉換檔案路徑的對話窗,調整所需的設定後,點按轉換:
當看到下面的訊息時,就表示轉檔工作成功地完成了。
它還有更多應用,可以參考重灌狂人的介紹。
若你有興趣,可以看看使用Freemake Video Converter來編輯、旋轉影片。
Amazon Ads
2014年3月30日 星期日
2014年3月29日 星期六
【JS筆記】正規表示式(Regular Expression)中帶有中括號的比對模式
前面探討過一個簡單的正規表示式:
再來看看,若上列的模式用一對中括號包起來呢?如下列模式:
是的,就是這樣沒錯。
當比對模式有用
另外,也可以使用
還有:
參考資料:
var pat = /abc/; pat.test('abc is before def'); //true pat.test('ab'); //false以上列的模式
/abc/
來比對字串時,只有要比對的字串中,一定包含著「abc」這個字串,匹配才會成功,test()
函式才會回傳true
。再來看看,若上列的模式用一對中括號包起來呢?如下列模式:
var pat1 = /[abc]/; pat1.test('ab'); //true pat1.test('apple'); //true pat1.test('big'); //true pat1.test('dig'); //false由上列的範例,好像只要比對的字串中,只要含有比對模式中一個字元,就能匹配成功?
是的,就是這樣沒錯。
當比對模式有用
[]
包起來時,只要比對的字串中,含有任何一個中括號內的字元,就能匹配成功。另外,也可以使用
-
來表示一個區間內的比對字元,如:
var pat2 = /[A-Z]/; //比對的字串中,要含有任一個由A至Z的「大寫」字母 pat2.test('apple'); //false pat2.test('Apple'); //true var pat3 = /[1-9]/; //比對的字串中,要含有任一個由1至9的數字 pat3.test('abc'); //false pat3.test('1st'); //true如果你想學好JavaScript,我推薦:
參考資料:
Labels:
正規表示式,
JavaScript,
Regular Express
2014年3月28日 星期五
【J筆記】使用Struts2回傳JSON字串
在很多時候,動態網頁需要回應JSON字串給客戶端程式如JavaScript來做後續的處理的。我這裡做一個以Struts2回應的範例,以供日後回顧參考。
這裡的範例是以「2.3.16.1」為主。
需要的jar檔如下:
先簡單看一下
再來看
這裡使用Struts2定義的
再來我只要再定義一個Action,它在
上列程式碼,可至這裡下載。
這裡的範例是以「2.3.16.1」為主。
需要的jar檔如下:
先簡單看一下
web.xml
的配置:
主要意思是,將所有的回應,轉給Struts來做處理。mystruts struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*
再來看
struts.xml
的配置:
需要注意的是第9至11行這邊,需要替我要回傳的JSON格式定義一個/index.jsp /pages/HelloWorld.jsp jsonString
result-type
,在這裡就是json。
這裡使用Struts2定義的
org.apache.struts2.json.JSONResult
類別。
再來我只要再定義一個Action,它在
execute
方法處理好要轉成JSON字串的物件,並返回json_ok的結果就好,如上的第16至20行。
JsonAction.java
的程式如下:
package org.apache.struts.helloworld.action; import java.util.HashMap; import java.util.Map; import org.apache.struts.helloworld.model.JsonString; import com.opensymphony.xwork2.ActionSupport; public class JsonAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1645961153075600530L; private JsonString jsonString; public String execute() throws Exception { Map啟動伺服器後,送出要求後,就會得到下列的結果:map = new HashMap (); map.put("abc", "123"); map.put("def", "456"); this.getJsonString().setRes(map); return "json_ok"; } public JsonString getJsonString() { if(jsonString == null) { this.jsonString = new JsonString(); } return jsonString; } public void setJsonString(JsonString jsonString) { this.jsonString = jsonString; } }
上列程式碼,可至這裡下載。
2014年3月27日 星期四
【JS筆記】使用Rhino shell來執行JavaScript
很多時候,我若要寫個JavaScript就要先寫個HTML檔案,然後再寫JavaScript,若使用Rhino來執行,就不用這麼麻煩了。
Rhino是個開源(open-source)的,而且完全用Java寫成的JavaScript的實作,只要我的電腦可以執行Java,就可以使用它,可以到這裡下載。
下載完成後,只要把下載的檔案解壓縮,然後用Windows的「命令提示字元」或Linux的「終端機」
前往解壓後的資料夾,執行
Rhino是個開源(open-source)的,而且完全用Java寫成的JavaScript的實作,只要我的電腦可以執行Java,就可以使用它,可以到這裡下載。
下載完成後,只要把下載的檔案解壓縮,然後用Windows的「命令提示字元」或Linux的「終端機」
前往解壓後的資料夾,執行
js.jar
,如:
$ cd tools/JavaScript/rhino1_7R4 $ java -jar js.jar Rhino 1.7 release 4 2012 06 18 js>之後,我們就可以如在文字編輯器中寫JavaScript撰寫程式碼,如:
js> var a = 1, b = 2; js> a + b 3
Labels:
JavaScript
【R筆記】R的套件安裝
先來認識一下CRAN。
CRAN是指存在於世界各地間,由ftp與網頁伺服所組成的網路,在這網路中存放相同的、最新版本的R程式碼和文件。
若要在CRAN下載套件(package)的話,可以依照下列步驟進行,這裡的環境是以Windows 7為主。
點按程式套件→安裝程式套件...:
會先出現CRAN的鏡像(mirror)網站列表,先選一個離我最近的鏡像點。
我這裡選擇的是Taiwan(Taipei)。
再來會顯示套件的選擇對話窗,直接點選我要安裝的套件後,點按確定即可。
這裡值得注意的是,若我選擇安裝的套件有相依的套件,R會幫我安裝需要的相依套件後,我不用花時間去解決或煩惱套件間的相依問題。
若要移除已安裝的套件,就用
CRAN是指存在於世界各地間,由ftp與網頁伺服所組成的網路,在這網路中存放相同的、最新版本的R程式碼和文件。
若要在CRAN下載套件(package)的話,可以依照下列步驟進行,這裡的環境是以Windows 7為主。
點按程式套件→安裝程式套件...:
會先出現CRAN的鏡像(mirror)網站列表,先選一個離我最近的鏡像點。
我這裡選擇的是Taiwan(Taipei)。
再來會顯示套件的選擇對話窗,直接點選我要安裝的套件後,點按確定即可。
這裡值得注意的是,若我選擇安裝的套件有相依的套件,R會幫我安裝需要的相依套件後,我不用花時間去解決或煩惱套件間的相依問題。
若要移除已安裝的套件,就用
remove.package()
這個函式,如:
> remove.packages('actuar')
Labels:
R
【JS筆記】正規表示式(Regular Expression)的「^」與「$」特殊符號
若想要有個方便的工具來練習JavaScript,可以看看使用Rhino shell來執行JavaScript這一篇。
我先來寫一個最簡單的表示式:
用白話文來講,就是比對的字串中,只要有
再來我們在表示式中,加入一個
由上面的例子我可以知道,在正規表示式中,加入
用白話文來講,使用這樣的比對模式時,就是比對的字串,開頭的四個字元一定要是
這裡要注意的是,
延續上面的例子,再來看另一個特殊字元
若它是放在比對模式中的其他位置,是沒有特殊意義的,這點要注意。
看看下面的範例。
我知道了
參考資料:
我先來寫一個最簡單的表示式:
var pat1 = /java/; var str1 = 'javascript'; var str2 = 'i love java'; pat1.test(str1); //結果為 true pat1.test(str2); //結果為 true因為上列比對的兩個字串
str1
和str2
中,都有全為小寫的java
,所以比對的結果都會回傳true
。
用白話文來講,就是比對的字串中,只要有
java
,就能匹配成功。
再來我們在表示式中,加入一個
^
的特殊字元:
var pat2 = /^java/; var str1 = 'javascript'; var str2 = 'I love java'; pat2.test(str1); //結果為 true pat2.test(str2); //結果為 false上列比對的兩個字串中,都有全為小寫的
java
,但這次str1
比對的結果回傳true
,而str2
比對的結果回傳false
。
由上面的例子我可以知道,在正規表示式中,加入
^
後,則比對的目標字串的起始位置,要含有^
後面的字元或字串,才能成功匹配,才會回傳true
,例如上列的str1
起始四個字元與定義的模式java
匹配,而str2
雖然含有java
,但它不在一開頭的位置上。
用白話文來講,使用這樣的比對模式時,就是比對的字串,開頭的四個字元一定要是
java
,才能匹配成功。
這裡要注意的是,
^
要放在比對模式的第一個字元,若放在其他地方,則有「否定」的意思,這之後會去探討。
延續上面的例子,再來看另一個特殊字元
$
,它若放在比對模式的「最後一個字元」,則表示要比對的字串,最後結尾的部份,要符合$
符號前面定義的模式,才能匹配成功。
若它是放在比對模式中的其他位置,是沒有特殊意義的,這點要注意。
看看下面的範例。
var pat3 = /java$/; pat3.test(str1); //結果為false pat3.test(str2); //結果為true,因為str2是java結尾,所以比對成功 var str3 = 'I love jave'; pat3.test(str3); //結果為 false var str4 = 'I love javaa'; pat3.test(str4); //結果為 false所以用白話文來講,使用這樣的比對模式時,就是比對的字串,結尾的最後四個字元一定要是
java
,才能匹配成功。
我知道了
^
和$
在正規表示中的意思了,那下列的比對模式,要怎樣的字串才能匹配成功呢?
var pat4 = /^java$/;有時間就try一下吧!
參考資料:
Labels:
正規表示式,
JavaScript,
Regular Express
2014年3月26日 星期三
【分享】Ubuntu解決SVN「資料不存在」、「Access to ... probidden」的問題
今天在用Eclipse更新SVN程式或要連線到SVN時,突然出現下列訊息:
或是「URL access forbidden for unknown reason」、「Access to 'http://... ' forbidden」,如下訊息:
看到「Access forbidden」讓我想到有可能是SVN認證的問題,於是就先試著把家目錄中subversion下的auth資料夾刪掉看看:
這是我的經驗,與你分享!
或是「URL access forbidden for unknown reason」、「Access to 'http://... ' forbidden」,如下訊息:
看到「Access forbidden」讓我想到有可能是SVN認證的問題,於是就先試著把家目錄中subversion下的auth資料夾刪掉看看:
rm -r -f ~/.subversion/auth果然問題就解決了。
這是我的經驗,與你分享!
Labels:
Subclipse,
Subversion,
Ubuntu
2014年3月25日 星期二
【R筆記】初探R的矩陣
R的矩陣(matrix)就是有維度(dimension)的向量(vector)。
一講到這,愈看愈抽像,來看看一些函式和例子吧! 首先要提到每一個物件都有一個屬性叫
再來來看看文件:
「矩陣是有維度的向量」,那我們要取得矩陣之前,就先要有個向量出來:
一講到這,愈看愈抽像,來看看一些函式和例子吧! 首先要提到每一個物件都有一個屬性叫
dim
,它是一個函式(function),它的功能在取得或設定一個物件的維度。
再來來看看文件:
> ?dim文件中對於
dim()
的描述是:取得或設定一個物件的維度。「矩陣是有維度的向量」,那我們要取得矩陣之前,就先要有個向量出來:
> profit <- c(2.0, 2.1, 2.2, 2.1, 2.3, 2.4) > profit [1] 2.0 2.1 2.2 2.1 2.3 2.4再來使用
dim()
函式把向量profit
轉為矩陣:
> dim(profit) <- c(2, 3) > profit [,1] [,2] [,3] [1,] 2.0 2.2 2.3 [2,] 2.1 2.1 2.4上列指令把向量
profit
轉為一個2 X 3的矩陣,再來我們就可以下列指令,來取得矩陣中的資料:
> profit[1,] [1] 2.0 2.2 2.3上列會取得第一列的資料。
> profit[,2] [1] 2.2 2.1上列會取得第二欄的資料。
> profit[1,3] [1] 2.3上列會取得第一列、第三欄的資料。 你可以比較原來的向量和之後的矩陣,看資料是怎麼放的。
Labels:
R,
statistics
2014年3月24日 星期一
【JS筆記】勇敢面對JavaScript中正規表示式(Regular Express)
首先,若想要有個方便的工具來練習JavaScript,可以看看使用Rhino shell來執行JavaScript這一篇。
根據W3C的定義,在JavaScript中,正規表示式(regular expression)是一個描述字元模式 (a pattern of characters) 的物件,它可以用來查看某一段文字是否符合我們定義的文字模式,也可以用來找尋或取代文字中符合模式的字串,而且在String和RegExp中定義了一些方法,搭配正規表示式,就能對文字進行強大的模式匹配、搜尋或取代的功能。
我們要得到一個regular expression的物件的話,可以使用下列語法:
而
用些例子來說明吧!
再來看
再來加入
上列的也可以一起混用,如:
接下來,我要開始探索比對模式的部份。
如果你想學好JavaScript,我推薦:
還有:
根據W3C的定義,在JavaScript中,正規表示式(regular expression)是一個描述字元模式 (a pattern of characters) 的物件,它可以用來查看某一段文字是否符合我們定義的文字模式,也可以用來找尋或取代文字中符合模式的字串,而且在String和RegExp中定義了一些方法,搭配正規表示式,就能對文字進行強大的模式匹配、搜尋或取代的功能。
我們要得到一個regular expression的物件的話,可以使用下列語法:
var pt = new RegExp(pattern, modifiers);或是
var pt = /pattern/modifiers; //我自己實作上比較常用這一方式上列語法中:
pattern
是我們要定義的「表式示的模式」(pattern of expression)。
而
modifiers
指明我們想要做是「不分大小寫」、「全部」或「多行」的比對,定義如下:i
:做不分大小寫(case-0insensitvie matching)的比對。g
:對全部要比對的字串,做比對,而不是比對成功後就停下來。m
:做多行的比對。
用些例子來說明吧!
//這個表示式的意思是,要找比對的字串中,有沒有含有字母「e」或「E」。 var reg1 = new RegExp('e', 'i'); //或者 var reg1 = /e/i; 請注意,這裡不用單引號或雙引號來包字串 //然後用來測試字串 reg1.test('e'); //結果 true reg1.test('E'); //結果 true這次若不加
i
再測試看看:
//這個表示式的意思是,要找比對的字串中,有沒有含有字母「e」, //沒加「i」,所以有分大小寫 var reg1 = new RegExp('e'); reg1.test('e'); //結果為 true reg1.test('E'); //結果為 false從上列結果來看,若有加
i
的modifier的話,則在比對時,就不會去分大小寫。
再來看
g
這個modifier,要看這個參數的功能我們要用String
的match()
函式來說明。
var reg = /has/; var para = 'He has a friend who has a dog that has long tail'; para.match(reg); //結果為has在上列程式中,
match()
函式會以array object
回傳比對成功的結果,雖然在我們比對的字串para
中有三個has
,但這裡回傳的陣列只包含了第一個比對成功的字串。
再來加入
g
參數:
var reg = /has/g; para.match(reg); //結果 has,has,has現在回傳的陣列長度為3,包含了三個「has」了。
上列的也可以一起混用,如:
var reg = /has/gi; //比對不分大小寫,而且要比對到字串結尾為止 para.match(reg); //結果 has,has,has至於
m
這個modifier,目前還沒想到比較好的例子,在這裡先跳過了。
接下來,我要開始探索比對模式的部份。
如果你想學好JavaScript,我推薦:
Labels:
正規表示式,
JavaScript,
Regular Express
2014年3月22日 星期六
【分享】Oralce認證:OCEEJBD(Java EE 6 Enterprise JavaBeans Developer Certified Expert Exam,1z0-895)的考取心得
上個月以還算可以的分數,考過了Oracle編號1z0-895的認證,它的前身為SCBCD。
在考試的準備上,先在JavaRanch的SCBCD Links找相關的準備資料,再到JavaRanch的考試結果討論區去看考過的人如何準備。
我是以EJB spec為主,若是以認證考試為目標的話,第六章至第十一章是可以先跳過的。
另外再以下列兩位仁兄無私提供的筆記為輔。
現在的最新版本是「7」,若你真要選擇「6」的版本,就在此頁中找到「Previous Releases」進去下載,選擇GlassFish有的下載,在安裝過程中,也會一起安裝GlassFish。
若在論壇中,大都建議可以找一本比較好的書開始,而不要一開始就念Spec,我的感想也是一樣,若一開始就念Spec,對沒有開發經驗的人來說,可能會像「瞎子摸象」,大部份考過的人都建議這本:
若你喜歡動手寫程式的話,其實上面這本裡面就有很多範例程式了,若還想多練習的話,可以考慮這一本:
我自己是有買下列的「MEAP」版本,但實體書還沒出,我就考完了。
另外,我有使用的Enthuware出的模擬考題,我的心得是對我助益非常地大,在做模擬考題的過程中,把原本零散的觀念串了起來,還有在範例程式和Spec中不會注意到的細節,一定會有「喔!原來是這樣」的驚喜!
這一張認證的考試沒有想像中的難,但也是在念過Spec三、四次後,才有這種感覺,我覺得模擬考題一定要做,無論對錯,它說明的觀念一定要搞清楚,不清楚的地方,再回去翻Spec加強觀念。
實際考試中,大部份的題目都是單選,多選也會跟你說選項有幾個,而且大部份多選都是「2」個選項,只要觀念清楚點,不會太難選。
在考試的準備上,先在JavaRanch的SCBCD Links找相關的準備資料,再到JavaRanch的考試結果討論區去看考過的人如何準備。
我是以EJB spec為主,若是以認證考試為目標的話,第六章至第十一章是可以先跳過的。
另外再以下列兩位仁兄無私提供的筆記為輔。
- Frits Walraven的筆記,在SCBCD Links中也可以找到其它格式,內容主要是Spec的重點整理,因為大都以條理式的方式去整理比較重要的點,很容易背誦,我建議多看幾次。
- Ivan Krizsan's的筆記,這是他在準備考試時的筆記,裡面很多以範例程式來說明EJB的重點,自己真的用手去寫它的範例程式 (就是不要用複製貼上),可以實際地去體會一下,EJB是如何去運作,建議可以多念幾次,至少要真的了解他的範例程式要表達的觀念,我建議可以從這份文件開始念。
現在的最新版本是「7」,若你真要選擇「6」的版本,就在此頁中找到「Previous Releases」進去下載,選擇GlassFish有的下載,在安裝過程中,也會一起安裝GlassFish。
若在論壇中,大都建議可以找一本比較好的書開始,而不要一開始就念Spec,我的感想也是一樣,若一開始就念Spec,對沒有開發經驗的人來說,可能會像「瞎子摸象」,大部份考過的人都建議這本:
若你喜歡動手寫程式的話,其實上面這本裡面就有很多範例程式了,若還想多練習的話,可以考慮這一本:
我自己是有買下列的「MEAP」版本,但實體書還沒出,我就考完了。
另外,我有使用的Enthuware出的模擬考題,我的心得是對我助益非常地大,在做模擬考題的過程中,把原本零散的觀念串了起來,還有在範例程式和Spec中不會注意到的細節,一定會有「喔!原來是這樣」的驚喜!
這一張認證的考試沒有想像中的難,但也是在念過Spec三、四次後,才有這種感覺,我覺得模擬考題一定要做,無論對錯,它說明的觀念一定要搞清楚,不清楚的地方,再回去翻Spec加強觀念。
實際考試中,大部份的題目都是單選,多選也會跟你說選項有幾個,而且大部份多選都是「2」個選項,只要觀念清楚點,不會太難選。
Labels:
Oracle認證
2014年3月21日 星期五
【R筆記】初探R模式(mode)與類別(class)
在R中,每一個物件(object)都有一個模式(mode),它在說明資料是以何種型式儲存在記憶體中。
若要取得物件的模式,可以使用
再來看看
鏘鏘鏘!在【R筆記】初探R資料結構-向量(Vector)有提到,在向量中所有的元素,其資料型別都要一樣,指的就是元素所有的模式。 接著,我們來看看列表(List)的模式為何:
最後,我們常常在使用的各種函式,也有自己的模式,如
若你想進一步認識R,我推薦R 錦囊妙計。
若要取得物件的模式,可以使用
mode()
,這個函數,它需要一個R物件當做參數,下列是一些例子:
1.41421
,在 R 的模式是numberic
:
> mode(1.141421) [1] "numeric"
"Hello R"
的模式是character
:
> mode("Hello R") [1] "character"當我們指定了一個向量(Vector)後,它的模式是由它所包含的元素來決定的:
> n <- c(1, 2, 3, 4, 5) > mode(n) [1] "numeric" > n1 <- c("a", "b", "c") > mode(n1) [1] "character"上列
n
變數所包含的元素的模式皆為numeric
所以它的模式是numeric
。
再來看看
n1
,它所包含的元素的模式皆為character
所以它的模式是character
。
鏘鏘鏘!在【R筆記】初探R資料結構-向量(Vector)有提到,在向量中所有的元素,其資料型別都要一樣,指的就是元素所有的模式。 接著,我們來看看列表(List)的模式為何:
> list2 <- list(1, 2, 3, "x", "y", "z") > mode(list2) [1] "list"因為我們在【R筆記】初探R資料結構-列表(List)中有提到,在列表所包含的元素,其模式可以不一樣,所以使用
mode()
函式看模式時,有另一種list
的模式。
最後,我們常常在使用的各種函式,也有自己的模式,如
print()
函式的模式是function
> mode(print) [1] "function"在R中,每一個物件也有一個類別(class),相對於模式來講,它具備的是比較抽象的概念,R根據一個物件類別,來決定以何種方式來做資料處理。 如我們看一個內建的資料集
mtcars
的模式和類別:
> mode(mtcars) [1] "list" > class(mtcars) [1] "data.frame"上列結果說明,
mtcars
這個資料集是以list
型式儲存在記憶體中,而我們要處理它時,如使用print()
函式將mtcars
輸出,R會依據它的類別來做合適的處理。
若你想進一步認識R,我推薦R 錦囊妙計。
Labels:
R
【R筆記】初探R資料結構-列表(List)
這裡我們來認識一下R中的列表(List)資料結構。
要宣告一個列表的變數時,可以使用下列的指令:
在同一個列表中的各個元素,可以各自是不同的資料型別,如:
我們也可以使用多個索引來取得列表中某一群的元素。
使用下列指令,我們可以取得第1、3、5個元素所組成的列表:
我們可以為列表中的元素設定名稱。
還有只有 Kindle 版本的這本:
> mylist <- list(1, 2, 3, 4, 5) > mylist [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5跟向量(vector)不一樣的是,列表中的元素可以是異質 (heterogeneous) 的。
在同一個列表中的各個元素,可以各自是不同的資料型別,如:
> list2 <- list(1, 2, 3, "x", "y", "z") > list2 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] "x" [[5]] [1] "y" [[6]] [1] "z"我們可以使用索引(index)來取得或參照到列表中某一位置的元表 下列的指令,參照到
list2
中第三個元素:
> list2[[3]] [1] 3鏘鏘鏘!這裡的中括號要有兩個,請記住,是兩個!
我們也可以使用多個索引來取得列表中某一群的元素。
使用下列指令,我們可以取得第1、3、5個元素所組成的列表:
> list2[c(1, 3, 5)] [[1]] [1] 1 [[2]] [1] 3 [[3]] [1] "y"鏘鏘鏘!這裡的中括號只有一個!
我們可以為列表中的元素設定名稱。
> names(list2) <- c("le1", "le2", "le3", "le4", "le5", "le6") > list2 $le1 [1] 1 $le2 [1] 2 $le3 [1] 3 $le4 [1] "x" $le5 [1] "y" $le6 [1] "z"在指定元素名稱之後,要取得某一位置的元素,除了使用索引值之外,也可以使用「元素名稱」當索引來取得:
> list2[["le1"]] [1] 1或使用「list名稱$元素名稱」的方式來取得:
> list2$le1 [1] 1鏘鏘鏘!上列指令中,兩個名稱之間是一個「$」符號。 如果你需要進一步地認識 R,我推薦:
Labels:
R
2014年3月19日 星期三
【R筆記】初探R資料結構-向量(Vector)
在 R 中 Vector 是最常用的資料結構,使用它前,我們需要了它幾個主要的特性。
在 Vector 中的資料,需要是同質性的,也是說在一個 Vector 的所有元素 (element),需要是同一型別,用 R 的話來說,就是要同一種模式 (mode)。
如我們指定一個 Vector 給變數
Vector 可以使用索引 (index) 來取得多個位置的元素,並回傳一個 Vector,如:
如果你需要進一步地認識 R,我推薦:
還有只有 Kindle 版本的這本:
在 Vector 中的資料,需要是同質性的,也是說在一個 Vector 的所有元素 (element),需要是同一型別,用 R 的話來說,就是要同一種模式 (mode)。
如我們指定一個 Vector 給變數
d
,則在指定的元素中,需要是同型別的:
> d <- c(1, 2, 3, 4, 5) > d [1] 1 2 3 4 5若我們在指定 Vector 時,指定了不同型別的元素,則 R 會自動幫我們轉型:
> e <- c(1, 2, "a", "b") > e [1] "1" "2" "a" "b"或是
> f <- c(2.0, e) > f [1] "2" "1" "2" "a" "b"Vector可以使用索引 (index) 來取得某一位置的元素,如: > d[3] [1] 3 上列的指令取得
d
中第三個元素的值,這裡要注意的是,在R
中的索引,是由1
算起,而不是0
。Vector 可以使用索引 (index) 來取得多個位置的元素,並回傳一個 Vector,如:
> d <- c(2, 4, 6, 8, 10) > g <- d[c(1, 3, 5)] > g [1] 2 6 10Vector 中的元素可以被設定一個名稱,Vector 有一個
names
的屬性,我們可以使用它來設定 Vector 的元素名稱,如:
> names(d) <- c("element1", "element2", "element3", "element4", "element5") > d element1 element2 element3 element4 element5 2 4 6 8 10請注意,這裡的
names
有「s」。
一旦給了元素名稱之後,我們也就可以使用名稱來取得 Vector 的元素了:
> d["element1"] element1 2鏘!鏘!在中括號的元素名稱,請記得用兩個「"」 (雙引號) 包起來喔!
如果你需要進一步地認識 R,我推薦:
Labels:
R
2014年3月18日 星期二
【R筆記】R內建資料集
在
若要看目前可以使用的資料集有那些,可以使用
若我們想要使用其他套件的資料集的話,也是可以使用
要什麼引入與缷除套件,可以參考【R筆記】R的套件載入與缷除 。
如果你需要進一步地認識 R,我推薦:
還有只有 Kindle 版本的這本:
R
中,有一些內建的資料集,在學習或練習時,可以用來當做原始資料,如:
> CO2 Plant Type Treatment conc uptake 1 Qn1 Quebec nonchilled 95 16.0 2 Qn1 Quebec nonchilled 175 30.4 3 Qn1 Quebec nonchilled 250 34.8 4 Qn1 Quebec nonchilled 350 37.2 (以下略)上列結果會列出
CO2
這資料集中的欄位和資料,若只是要看某一欄位內的資料,可以使用「資料集名稱$欄位名稱」的指令來取得,如:
> CO2$Plant [1] Qn1 Qn1 Qn1 Qn1 Qn1 Qn1 Qn1 Qn2 Qn2 Qn2 Qn2 Qn2 Qn2 Qn2 Qn3 Qn3 Qn3 [18] Qn3 Qn3 Qn3 Qn3 Qc1 Qc1 Qc1 Qc1 Qc1 Qc1 Qc1 Qc2 Qc2 Qc2 Qc2 Qc2 Qc2 [35] Qc2 Qc3 Qc3 Qc3 Qc3 Qc3 Qc3 Qc3 Mn1 Mn1 Mn1 Mn1 Mn1 Mn1 Mn1 Mn2 Mn2 [52] Mn2 Mn2 Mn2 Mn2 Mn2 Mn3 Mn3 Mn3 Mn3 Mn3 Mn3 Mn3 Mc1 Mc1 Mc1 Mc1 Mc1 [69] Mc1 Mc1 Mc2 Mc2 Mc2 Mc2 Mc2 Mc2 Mc2 Mc3 Mc3 Mc3 Mc3 Mc3 Mc3 Mc3 12 Levels: Qn1 < Qn2 < Qn3 < Qc1 < Qc3 < Qc2 < Mn3 < Mn2 < ... < Mc1當我們要知道這些資料集中欄位意思等資訊,可以使用
help()
這個函式來開啟資料的相關文件:
> help(CO2)或是
> ?CO2就可以看到資料集描述、欄位定義與用法等資訊:
若要看目前可以使用的資料集有那些,可以使用
data()
這個函式:
> data()執行後,就會出現資料集的說明文件:
若我們想要使用其他套件的資料集的話,也是可以使用
data()
,但此時要傳入兩個參數,第一個參數是我們要引入的「資料集名稱」,第二個參數是該資料集所在的「套件名稱」,如在MASS
套件中,有一名為Cars93
的資料集,在引入之前使用他,會得這樣的結果:
> Cars93 錯誤: 找不到物件 'Cars93'若我們先執行下列指令:
> data(Cars93, package="MASS")再看一次
Cars93
的內容,就會看到他的資料結構:
> Cars93 Manufacturer Model Type Min.Price Price Max.Price 1 Acura Integra Small 12.9 15.9 18.8 2 Acura Legend Midsize 29.2 33.9 38.7 3 Audi 90 Compact 25.9 29.1 32.3 4 Audi 100 Midsize 30.8 37.7 44.6 5 BMW 535i Midsize 23.7 30.0 36.2 6 Buick Century Midsize 14.2 15.7 17.3 7 Buick LeSabre Large 19.9 20.8 21.7 8 Buick Roadmaster Large 22.6 23.7 24.9 9 Buick Riviera Midsize 26.3 26.3 26.3 (以下略)若我們己經有使用
library()
函式去引入MASS
這個套件,則我們可以直接使用Cars93
這個資料集。要什麼引入與缷除套件,可以參考【R筆記】R的套件載入與缷除 。
如果你需要進一步地認識 R,我推薦:
Labels:
R
【R筆記】R的套件載入與缷除
在使用 R 載入套件時,一定要先來認識 labrary() 這個函式:
再點「lda」,就可以看到如下的畫面:
太好了,在文件的第一行,我們可以看到「lda{MASS}」這一行字,在函式後面的大括號中所列出來的,是一個套件名稱,這表示「lad」這個函式,是存在於「MASS」這個套件中。我們知道要使用「lda」這個函式,就需要「MASS」這個套件,再來就是使用這個指令來引入:
若我們要檢視目前引入的套件有那些,可以使用這個 search() 這個函式:
還有只有 Kindle 版本的這本:
> ?library它的功能就是「載入並掛載附加套件」。 這個函式主要功能在用來載入我們要用的R套件,比如我們要用一函式名稱為 lda,首先想要瞭解一下它的用法:
> ?lda No documentation for ‘lda’ in specified packages and libraries: you could try ‘??lda’但我們會得上列的錯誤訊息,意思是說,在目前的套件或函式庫找不到 lad 這個函式的說明,它又很好心地告訴我們,可以試試「??lda」,於是我們在 console 中輸入:
> ??lda就會跑出來搜尋的結果的說明文件:
再點「lda」,就可以看到如下的畫面:
太好了,在文件的第一行,我們可以看到「lda{MASS}」這一行字,在函式後面的大括號中所列出來的,是一個套件名稱,這表示「lad」這個函式,是存在於「MASS」這個套件中。我們知道要使用「lda」這個函式,就需要「MASS」這個套件,再來就是使用這個指令來引入:
> library(MASS)引入之後,我們再輸入「?lda」這個指令,說明文件就會直接開啟,而不會回傳任何錯誤訊息了。
若我們要檢視目前引入的套件有那些,可以使用這個 search() 這個函式:
> search() [1] ".GlobalEnv" "package:MASS" "tools:RGUI" [4] "package:stats" "package:graphics" "package:grDevices" [7] "package:utils" "package:datasets" "package:methods" [10] "Autoloads" "package:base"嗯哼!在結果中,可以看出目前引入的套件,也包含 MASS 這個套件。 在引入某個套件後,若要缷除 (detach) 它,可以使用 detach() 這個命令,它需要傳入一個參數,就是我們要缷除的套件名稱,如:
> detach(package:MASS)這裡要注意的是,在參數中,缷除的套件名稱前,需要加「package:」。 缷除後,我們再使用 search(),再次檢視引入的套件時,就看不到「MASS」這個套件了:
> detach(package:MASS) > > search() [1] ".GlobalEnv" "tools:RGUI" "package:stats" [4] "package:graphics" "package:grDevices" "package:utils" [7] "package:datasets" "package:methods" "Autoloads" [10] "package:base"如果你需要進一步地認識 R,我推薦:
Labels:
R
2014年3月12日 星期三
【筆記】使用Redis client時的指令整理
使用 Redis client 連線到遠端伺服器,使用下列指令:
redis 127.0.0.1:6379> QUIT
連線到 Redis DB 後,要關閉伺服器,使用下列指令:
關閉 Redis DB,並且強制 DB 儲存目前的運作 (operation):
redis 127.0.0.1:6379> SHUTDOWN SAVE
關閉 Redis DB,並且制止 DB 儲存目前的運作 (operation):
redis 127.0.0.1:6379> SHUTDOWN NOSAVE
參考資料:
$ ./redis-cli -h your_ip使用 Redis client 要關閉與伺服器的連線,使用下列指令:
redis 127.0.0.1:6379> QUIT
連線到 Redis DB 後,要關閉伺服器,使用下列指令:
關閉 Redis DB,並且強制 DB 儲存目前的運作 (operation):
redis 127.0.0.1:6379> SHUTDOWN SAVE
關閉 Redis DB,並且制止 DB 儲存目前的運作 (operation):
redis 127.0.0.1:6379> SHUTDOWN NOSAVE
參考資料:
Labels:
Redis
【P筆記】PHP中 empty、isset,與 is_null 的用法
php.net的文件中,可以找到下列的一張表格,它說明了如何對一個變數做型別上的判斷等函數間的比較:
這裡到提到三個函數:empty()、is_null() 與 isset()。
empty
is_null
判斷傳入的變數是否為NULL。
isset
判斷一個變數是否己被設置 (set),而且不是 NULL,若使用 unset() 函數釋放 (unset) 一個變數之後,將該變數傳入 isset() 則會回傳 true。此函數可以接受多個參數,如:
現在擷取上列表格一些結果,以程式碼做些範例:
這裡到提到三個函數:empty()、is_null() 與 isset()。
empty
- 判斷傳傳入的變數是否為空,若傳入的變數是空、0、FALSE的值,或該變數不存在,則此函數傳回 true。在PHP5.5以前的版本,empty() 只支援以變數傳入,如 empty(0) 不是一個合法的呼叫方式。
- 下列的值會被視為是空的:""、0、"0"、NULL、FALSE、array()、$var (一個被宣告的變數,但沒有被指定值)。
is_null
判斷傳入的變數是否為NULL。
isset
判斷一個變數是否己被設置 (set),而且不是 NULL,若使用 unset() 函數釋放 (unset) 一個變數之後,將該變數傳入 isset() 則會回傳 true。此函數可以接受多個參數,如:
isset($x, $y, $z);當所有傳入的變數都有被設置時,此函式才會回傳 true。
現在擷取上列表格一些結果,以程式碼做些範例:
var_dump(empty($v0)); //若變數傳入 empty 前未宣告 ,empty 回傳:true var_dump(is_null($v0)); //若變數傳入 is_null 前未宣告, //is_null 會報「Undefined variable」的錯誤 var_dump(isset($v0)); //若變數傳入 isset 前未宣告 ,isset 回傳:false $v1 = ""; var_dump(empty($v1)); //若變數值為 "",empty 回傳:true var_dump(is_null($v1)); //若變數值為 "",is_null 回傳:false var_dump(isset($v1)); //若變數值為 "",isset 回傳:true $v2 = NULL; var_dump(empty($v2)); //若變數值為 NULL,empty 回傳:true var_dump(is_null($v2)); //若變數值為 NULL,is_null 回傳:true var_dump(isset($v2)); //若變數值為 NULL,isset 回傳:false $v3 = array(); //(空陣列) var_dump(empty($v3)); //若變數值為 array() (空陣列),empty 回傳:true var_dump(is_null($v3)); //若變數值為 array() (空陣列),is_null 回傳:false var_dump(isset($v3)); //若變數值為 array() (空陣列),isset 回傳:true $v4 = FALSE; var_dump(empty($v4)); //若變數值為 FALSE,empty 回傳:true var_dump(is_null($v4)); //若變數值為 FALSE,is_null 回傳:false var_dump(isset($v4)); //若變數值為 FALSE,isset 回傳:true $v5 = TRUE; var_dump(empty($v5)); //若變數值為 TRUE,empty 回傳:false var_dump(is_null($v5)); //若變數值為 TRUE,is_null 回傳:false var_dump(isset($v5)); //若變數值為 TRUE,isset 回傳:true $v6 = "FALSE"; var_dump(empty($v6)); //若變數值為 "FALSE"(字串),empty 回傳:false var_dump(is_null($v6)); //若變數值為 "FALSE"(字串),is_null 回傳:false var_dump(isset($v6)); //若變數值為 "FALSE"(字串),isset 回傳:true $v7 = "TRUE"; var_dump(empty($v7)); //若變數值為 "TRUE"(字串),empty 回傳:false var_dump(is_null($v7)); //若變數值為 "TRUE"(字串),is_null 回傳:false var_dump(isset($v7)); //若變數值為 "TRUE"(字串),isset 回傳:true $v8 = 0; var_dump(empty($v8)); //若變數值為 0,empty 回傳:true var_dump(is_null($v8)); //若變數值為 0,is_null 回傳:false var_dump(isset($v8)); //若變數值為 0,isset 回傳:true $v9 = "0"; var_dump(empty($v9)); //若變數值為"0"(字串),empty 回傳:true var_dump(is_null($v9)); //若變數值為"0"(字串),is_null 回傳:false var_dump(isset($v9)); //若變數值為 "0"(字串),isset 回傳:true
Labels:
PHP
2014年3月10日 星期一
【J筆記】Java的小數點進位與四捨五入
在Java中對小數點做四捨五入,是拜歐曾經的痛,不過,只痛那一下下,之後就通體舒暢了。
要在Java中對小數做處理,不得不提到BigDecimal這個類別,使用它的setScale方法,就可以得到想要的小數點處理。
如,要做四捨五入:
得到的結果:
在setScale中,傳入的第一個參數為要進位的小數點位數,第二個參數表示進位時的方式,如上例就是我們熟知的「四捨五入」,當要捨去的位數為「>= 5」時,就進位,詳細請見Java Doc。
大概知道用法後,來看一個令拜歐一度視為「玄學」的現象:
在上列程式碼第17行的地方,拜歐將參數改成BigDecimal.ROUND_HALF_DOWN,在Java Doc中,若在setScale使用此參數,則捨去的部位要「> 5」才會做進位,所以「3.45」使用此參數,要進位到小數點下一位,應該是「3.4」,但程式執行得到的結果卻是:
去看了一下BigDecimal中的建構方法中有提到:你宣告一個double變數出來丟進BigDecimal中的建構方法中,如上列的「3.45」,但在Java中,「3.45」真正的值是「3.4500000000000000....555...」,所以上列程式捨去的部份是「> 5」的。
若你要精確地建構「3.45」的BigDecimal物件,就要用new BigDecimal(String str)這個建構方法,如:
執行結果:
要在Java中對小數做處理,不得不提到BigDecimal這個類別,使用它的setScale方法,就可以得到想要的小數點處理。
如,要做四捨五入:
package idv.jk.math; import java.math.BigDecimal; public class BigDecimalEx { public static void main(String... args){ double a = 3.454; double b = new BigDecimal(a) .setScale(1, BigDecimal.ROUND_HALF_UP) .doubleValue(); System.out.println("四捨五入到小數點下一位: " + b); b = new BigDecimal(a) .setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue(); System.out.println("四捨五入到小數點下二位: " + b); } }
得到的結果:
四捨五入到小數點下一位: 3.5 四捨五入到小數點下二位: 3.45
在setScale中,傳入的第一個參數為要進位的小數點位數,第二個參數表示進位時的方式,如上例就是我們熟知的「四捨五入」,當要捨去的位數為「>= 5」時,就進位,詳細請見Java Doc。
大概知道用法後,來看一個令拜歐一度視為「玄學」的現象:
package idv.jk.math; import java.math.BigDecimal; public class BigDecimalEx { public static void main(String... args){ double a = 3.45; double b = new BigDecimal(a) .setScale(1, BigDecimal.ROUND_HALF_UP) .doubleValue(); System.out.println("四捨五入(ROUND_HALF_UP)到小數點下一位: " + b); b = new BigDecimal(a) .setScale(1, BigDecimal.ROUND_HALF_DOWN) .doubleValue(); System.out.println("四捨五入(ROUND_HALF_DOWN)到小數點下一位: " + b); } }
在上列程式碼第17行的地方,拜歐將參數改成BigDecimal.ROUND_HALF_DOWN,在Java Doc中,若在setScale使用此參數,則捨去的部位要「> 5」才會做進位,所以「3.45」使用此參數,要進位到小數點下一位,應該是「3.4」,但程式執行得到的結果卻是:
四拾五入(ROUND_HALF_UP)到小數點下一位: 3.5 四拾五入(ROUND_HALF_DOWN)到小數點下一位: 3.5
去看了一下BigDecimal中的建構方法中有提到:你宣告一個double變數出來丟進BigDecimal中的建構方法中,如上列的「3.45」,但在Java中,「3.45」真正的值是「3.4500000000000000....555...」,所以上列程式捨去的部份是「> 5」的。
若你要精確地建構「3.45」的BigDecimal物件,就要用new BigDecimal(String str)這個建構方法,如:
package idv.jk.math; import java.math.BigDecimal; public class BigDecimalEx { public static void main(String... args){ String a = "3.45"; double b = new BigDecimal(a) .setScale(1, BigDecimal.ROUND_HALF_UP) .doubleValue(); System.out.println("四捨五入(ROUND_HALF_UP)到小數點下一位: " + b); b = new BigDecimal(a) .setScale(1, BigDecimal.ROUND_HALF_DOWN) .doubleValue(); System.out.println("四捨五入(ROUND_HALF_DOWN)到小數點下一位: " + b); } }
執行結果:
四捨五入(ROUND_HALF_UP)到小數點下一位: 3.5 四捨五入(ROUND_HALF_DOWN)到小數點下一位: 3.4
Labels:
Java
【R筆記】使用R的向量(vector)的來做資料運算
vector 在 R 中是最簡單的資料結構,他是包含一系列資料的集合,如:
上列指定運算子右邊的 c(...) 其實是一個函數,可以在 R console 中輸入:
除了上列的指定方式外,我們也可以使用下列方式來指定一個 vector 內的元素:
若我們要取得 vector 某一個 index 的元素,可以使用:
另外,也可以使用判斷式來取得滿足某一條件的元素,像下列運算式中,會取得 v4 中大於、等於 6 的元素:
[1] 6 7 8 9 10
指定一個 vector 變數之後,我們就可以對他做一些運算、操作,如要取得平均值,例如,我們可以使用
這要注意的是,當使用兩個 vector 做運算時,其中一個 vector 內包含的元素數量,要是另一個 vector 中包含元素數量的倍數,不然就會出現如下的警告訊息:
v <- (1, 2, 3, 4, 5)上列的指定中,v 這個變數被指定了含有五個數字的集合。
ch <- c('a', 'b', 'c')上列的指定中,ch 這個變數被指定了含有三個字元的集合。
上列指定運算子右邊的 c(...) 其實是一個函數,可以在 R console 中輸入:
help(c)來看如何使用他的說明。
除了上列的指定方式外,我們也可以使用下列方式來指定一個 vector 內的元素:
v4 <- c(1, 2, 3, 6:10)這指定了「1, 3, 3, 6, 7, 8, 9, 10」給 v4 這個變數。
若我們要取得 vector 某一個 index 的元素,可以使用:
v4[1]這表示取得 v4 中的第一元素,這裡要注意的是 vector 的 index 是從 1 開始算的。
另外,也可以使用判斷式來取得滿足某一條件的元素,像下列運算式中,會取得 v4 中大於、等於 6 的元素:
v4[v4 >=6]結果:
[1] 6 7 8 9 10
指定一個 vector 變數之後,我們就可以對他做一些運算、操作,如要取得平均值,例如,我們可以使用
sd(v)或者使用 mean 函數來取得平均值,如:
mean(v)vector 另一個好用的地方,在於可以一次對 vector 中的所有元素 (element) 做運算,如:
1/v結果就會得到 v 中每一個元素的倒數。 也可以對兩個 vector 做加減乘除的運算,例如我們另外指定一個 v1 的變數:
v1 <- (2, 4, 6, 8, 10, 3, 6, 9, 12, 15)
v/v1依序就會得到 v 第1個元素除以 v1 第1個元素的值、 v 第2個元素除以 v4 第2個元素的值..., v 第1個元素除以 v4 第6個元素的值,以此類推。
這要注意的是,當使用兩個 vector 做運算時,其中一個 vector 內包含的元素數量,要是另一個 vector 中包含元素數量的倍數,不然就會出現如下的警告訊息:
警告訊息: In v/v1 : 較長的物件長度並非較短物件長度的倍數
Labels:
R,
statistics
2014年3月6日 星期四
【R筆記】R的指定運算子 (assignment operator)
在R中,指定運算子 (assignment operator) 是「<-」,就是一個小於符號加上一槓,例如:
另外,也可以使用「=」來指定變數的值,如:
還有,也可以用使用「->」,就是一槓加上一個大於的符號,將變數放在右邊,把值放在左邊,如:
有時候可能會看到有兩個小於加上一槓的指定運算子,像:
另外,上方程式碼中的空格,是為了增加易讀性,你當然也可以寫成:
在 R 中,還有一個函式 assign,也是用來指定變數的值:
x <- 168就是把「168」這個值指給「x」這個區域變數 (local variable)。
另外,也可以使用「=」來指定變數的值,如:
x = 168但這樣的方式可能會和「==」這個比較的運算子搞混,因此不建議這樣使用。
還有,也可以用使用「->」,就是一槓加上一個大於的符號,將變數放在右邊,把值放在左邊,如:
168 -> x但這樣程式碼一多的時候,會降低程式碼的可讀性,因此也不建議這樣使用。
有時候可能會看到有兩個小於加上一槓的指定運算子,像:
x <<- 168這個指定方式是把「168」這個值指定給「x」這個「全域變數 (global variable)」。
另外,上方程式碼中的空格,是為了增加易讀性,你當然也可以寫成:
x<-168但這樣擠在一起,程式看起來就不那麼易讀了。
在 R 中,還有一個函式 assign,也是用來指定變數的值:
> assign("y", 1234) > y [1] 1234我在指定一個變數之後,直接在 console 中輸入該變數,就可以輸出該變數的值了:
> x [1] 168這樣的結果,和使用 print 這個函數輸出的結果一樣:
> print(x) [1] 168當我要列出我有指定過的變數時,我可以用
> ls() [1] "x" "y"最後,當我離開 R 時,若有儲存工作空間,指定過的變數也會被儲存,再次開啟時,這些變數也一樣可以再被使用。
Labels:
R,
statistics
【R筆記】如何設定R的工作目錄 (working directory of R)
執行R的時候,可以使用下列指令,來取得目前所在的工作目錄:
R就會顯示目前所在的工作目錄:
若你要自訂執行R時的預設工作目錄,可以使用下列方法:
在桌面捷徑上點按滑鼠右鍵,開啟選單後再點按【內容】:
在「開始位置」的欄位中輸入你啟動程式後要做為預設工作目錄的資料夾位置:
點按【確定】後完成設定。
再執行一次 getwd() 就可以看到工作目錄已經更改。
若你有儲存某一個「.RData」在某個資料夾下,當你開啟該檔案後,R的工作目錄就會是存放該「.RData」檔的資料夾。
若你想要進一步學習R,我推薦:
getwd();
R就會顯示目前所在的工作目錄:
若你要自訂執行R時的預設工作目錄,可以使用下列方法:
在桌面捷徑上點按滑鼠右鍵,開啟選單後再點按【內容】:
在「開始位置」的欄位中輸入你啟動程式後要做為預設工作目錄的資料夾位置:
點按【確定】後完成設定。
再執行一次 getwd() 就可以看到工作目錄已經更改。
若你有儲存某一個「.RData」在某個資料夾下,當你開啟該檔案後,R的工作目錄就會是存放該「.RData」檔的資料夾。
若你想要進一步學習R,我推薦:
Labels:
R,
statistics
訂閱:
文章 (Atom)