在R中是否可以根据列表的值选择S4方法?
public class VideoMusicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
static List<VideoMusic> data;
public VideoMusicAdapter(List<VideoMusic> data) {
this.data = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.item_premium_video, parent, false);
return new VH(v);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
VideoMusic video = data.get(position);
VH vh = (VH) holder;
vh.tvArtist.setText(video.alias);
vh.tvSong.setText(video.judul);
vh.tvHarga.setText(video.price);
Picasso.with(vh.imgVideo.getContext())
.load(video.thumb_pic)
.placeholder(R.drawable.defaultbg)
.into(vh.imgVideo);
}
@Override
public int getItemCount() {
return (data == null) ? 0 : data.size();
}
public class VH extends RecyclerView.ViewHolder {
TextView tvArtist;
TextView tvSong;
TextView tvHarga;
ImageView imgVideo;
public VH(View itemView) {
super(itemView);
tvArtist = itemView.findViewById(R.id.tv_artist);
tvSong = itemView.findViewById(R.id.tv_title);
tvHarga = itemView.findViewById(R.id.tv_harga);
imgVideo = itemView.findViewById(R.id.iv_video);
}
}
}
或者我必须制作类似
的内容setGeneric(name = "mwe_fun"
, def = function(arg1) standardGeneric( "mwe_fun" ) )
setMethod(
f = "mwe_fun"
,signature = c("list_characterInside"),
function(arg1){
return("I am a character list")
})
setMethod(
f = "mwe_fun"
,signature = c("list_numericInside"),
function(arg1){
return("I am a numeric list")
})
## example:
mwe_fun(list("a"=c(1,2,3), "b"=c(2,3,4)))
# > "I am a numeric list"
mwe_fun(list("a"="asdjh", "b"="alkfjasfd"))
# > "I am a character list"
## maybe even:
mwe_fun(list("a"=c(1,2,3), "b"=c(2,3,4)))
# > "I am a NAMED numeric list"
mwe_fun(list(c(1,2,3), c(2,3,4)))
# > "I am a UNNAMED numeric list"
“看起来我的帖子主要是代码”,但我认为我的观点非常明确 - 如果不是,请告诉我!
答案 0 :(得分:1)
有几种方法可以为这只特殊的猫提供皮肤。如您所知,您不能使用普通的通用机制,因为所有这些对象的类只是list
。
一个简洁的解决方案是定义您自己的通用,但降低一级。如果此代码用于包,您甚至不需要导出该通用。例如:
setGeneric(name = ".mwe_fun",
def = function(list,listExample) standardGeneric( "mwe_fun" ),
signature=c("listExample") ## we don't include "list" in the signature
)
mwe_fun <- function(list){
.mwe_fun(list,list[[1]])
}
现在,您可以为.mwe_fun
编写用于签名listExample="numeric"
的方法,依此类推。
我编写它的方法是根据列表第一个元素的类选择方法。您可能希望以不同的方式执行操作(可能检查所有元素是否具有相同的类,如果没有则抛出错误)。这可以在调用mwe_fun
之前在.mwe_fun
内完成。
在包中,您只需要导出mwe_fun
。 .mwe_fun
可以完全驻留在包命名空间中,除非另一个包为它定义方法,否则不需要导出。