R S4签名:list-element

时间:2018-01-10 07:18:39

标签: r oop s4

在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"

“看起来我的帖子主要是代码”,但我认为我的观点非常明确 - 如果不是,请告诉我!

1 个答案:

答案 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可以完全驻留在包命名空间中,除非另一个包为它定义方法,否则不需要导出。