2011-03-04 20 views
3

我以爲我會嘗試寫一個R接口到Scribe(Pablo Fernandez用於Java的成熟OAuth庫),作爲一種在Java(8年內不使用它)上刷新自己的方式,學習rJava並更好地使用Twitter API。但主要是因爲這是星期五下午,我認爲這很有趣。 :)如何使用「java.lang.Class」的期望返回類型?

不幸的是我沒有得到很遠......

我下載了.jar file for scribecommons-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 

任何想法?

回答

1

它在我看來像提供者方法返回ServiceBuilder並將類作爲參數。

在Java中,如果您將類名後跟.class,並在代碼中生成類字面值對象。如果您使用反射來加載類,則可以通過字符串名稱引用類。我不確定這是如何工作在R,但在Java中的語法是:

Class c = Class.forName("org.scribe.builder.api.TwitterApi"); 

這將類實例放入變量c。然後,你可以調用provider方法:

service$provider(c); 
+0

這對我來說聽起來像是正確的行動採取,歡呼隊友,但我只是無法弄清楚如何把它變成rJava。 – 2011-03-08 16:07:40

+0

Java語法所做的是在「java.lang.Class」類上調用靜態方法「forName」。我不知道rJava或R,但你可能可以做c < - J(「java.lang.Class」)$ forName(「org.scribe.builder.api.TwitterApi」) – 2011-03-08 16:21:35