In the current implementation, the select() policy is applied only when a static character vector is supplied. Otherwise, it is ignored. Thus,
select(function(attrs) ifelse(attrs["resource"]<2, "berth1", c("berth2", "berth3")),
policy = "first-available")
selects always berth2 whenever attrs["resource"]>=2. There is no technical reason for ignoring the policy in this case, and it is counterintuitive from the user perspective.