我以爲我會嘗試寫一個R接口到Scribe(Pablo Fernandez用於Java的成熟OAuth庫),作爲一種在Java(8年內不使用它)上刷新自己的方式,學習rJava並更好地使用Twitter API。但主要是因爲這是星期五下午,我認爲這很有趣。 :)如何使用「java.lang.Class」的期望返回類型?
不幸的是我沒有得到很遠......
我下載了.jar file for scribe也commons-condec(其唯一的依賴,這是我後來解壓縮)。我使用NetBeans在Java中運行代碼,使用他的twitter example可以正常工作。
我確定由剛剛跟隨rJava documenation代碼的前幾行:
# load R packages
library(rJava)
# Initialise
.jinit()
# Add class paths
d1 <- "C:/Users/Tony/Documents/R/java/scribe-1.1.0.jar"
d2 <- "C:/Users/Tony/Documents/R/java/commons-codec-1.4/"
.jaddClassPath(path=c(d1, d2))
但隨後scribe quick start guide說,下面是需要:
// Java Code
OAuthService service = new ServiceBuilder()
.provider(TwitterApi.class)
.apiKey("6icbcAXyZx67r8uTAUM5Qw")
.apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
.build();
我想不出如何改寫成rJava的說法。有點網絡搜索建議我應該做的部分,所以首先我做到了:
# Create object (back to R code again)
(service <- .jnew("org.scribe.builder.ServiceBuilder"))
[1] "Java-Object{[email protected]}"
# Set up apiKey and apiSecret using "$" shortcut
service$apiKey("6icbcAXyZx67r8uTAUM5Qw")
service$apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
好迄今爲止。然後我需要弄清楚提供者函數的返回類型:
# Inspect return type
.jmethods(service, "provider")
[1] "public org.scribe.builder.ServiceBuilder org.scribe.builder.ServiceBuilder.provider(java.lang.Class)"
它需要「java.lang.Class」。這是我感到困惑的地方。那是什麼意思?我猜,看着source,它需要一個類型爲「ServiceBuilder」的返回類型,但是怎麼做呢?這是在看後我最好的猜測.jcall(注: 'use.true.class = TRUE' 沒做什麼):
> .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", method = "org.scribe.builder.ServiceBuilder.provider", "org.scribe.builder.api.TwitterApi")
Error in .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", :
method org.scribe.builder.ServiceBuilder.provider with signature (Ljava/lang/String;)Lorg.scribe.builder.ServiceBuilder; not found
任何想法?
這對我來說聽起來像是正確的行動採取,歡呼隊友,但我只是無法弄清楚如何把它變成rJava。 – 2011-03-08 16:07:40
Java語法所做的是在「java.lang.Class」類上調用靜態方法「forName」。我不知道rJava或R,但你可能可以做c < - J(「java.lang.Class」)$ forName(「org.scribe.builder.api.TwitterApi」) – 2011-03-08 16:21:35